본문 바로가기
PS/프로그래머스

[프로그래머스 *Java] - 큰 수 만들기

by Jman 2022. 7. 23.

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 이 된다고 생각하면 됨.