https://school.programmers.co.kr/learn/courses/30/lessons/42883
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
조건
제한 시간 : 1시간 이내
문제설명은 짧지만, 로직을 짜기 위한 생각을 오래 해야했던 문제였다.
로직 구현은 코드를 보고 실명하는게 빠를 거 같다. 코드를 확인해보자.
전체 코드
class Solution {
public String solution(String number, int k) {
StringBuilder answer = new StringBuilder("");
int start = 0;
while(start < number.length()) {
if(answer.length() == number.length() - k) break;
int changingLastIdx = k + answer.length() + 1;
int max = 0;
for (int j = start; j < changingLastIdx; j++) {
int currentNum = number.charAt(j) - '0';
if (max < currentNum) {
max = currentNum;
start = j + 1;
}
}
answer.append(max);
}
return answer.toString();
}
}
코드 설명
1.
while(start < number.length()) {
=> start 는 Idx 를 의미하는데, 가장 큰 수를 뽑고 그 뽑은 수 기점으로 앞에 작은 수는 다 없앤다고 생각하고 그 뒤부터 다시 탐색을 하기 위해서 Idx Number 를 저장하기 위한 변수.
2.
if(answer.length() == number.length() - k) break;
=> 문제에서 언급한 k 수 만큼 제거한 가장 큰 수가 만들어 졌을 때, break 로 빠져나온다.
3.
int changingLastIdx = k + answer.length() + 1;
int max = 0;
for (int j = start; j < changingLastIdx; j++) {
int currentNum = number.charAt(j) - '0';
if (max < currentNum) {
max = currentNum;
start = j + 1;
}
}
answer.append(max);
=> for 문에서 로직
changingLastIdx = 5;
4177252841
*loop 범위 (0~5)
max = 7(Idx = 2)
answer = 7
changingLastIdx = 6;
4177252841
*loop 범위 (3~6)
max = 7(Idx = 3)
answer = 77
changingLastIdx = 7;
4177252841
*loop 범위 (4~7)
max = 5(Idx = 5)
answer = 775
changingLastIdx = 8;
4177252841
*loop 범위 (6~8)
max = 8(Idx = 7)
answer = 7758
changingLastIdx = 9;
4177252841
*loop 범위 (8~9)
max = 4(Idx = 8)
answer = 77584
changingLastIdx = 10; (마지막 number라는 Stirng의 Idx 수!)
4177252841
*loop 범위 (9~10)
max = 1(Idx = 9)
answer = 775841
최종적으로 break; 문에 걸려서 return answer 이 된다고 생각하면 됨.
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스 *Java] - 타겟 넘버 (0) | 2022.07.28 |
---|---|
[프로그래머스 *Java] 영어 끝말잇기 (0) | 2022.07.28 |
[프로그래머스 *Java] - 카펫 (0) | 2022.07.21 |
[프로그래머스 *Java] - 위장 (0) | 2022.07.20 |
[프로그래머스 *Java] - H-Index (0) | 2022.07.20 |