-
프로그래머스 큰 수 만들기(자바) - 탐욕법 Greedy코딩테스트 2022. 4. 12. 16:54
문제 설명
어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건- number는 2자리 이상, 1,000,000자리 이하인 숫자입니다.
- k는 1 이상 number의 자릿수 미만인 자연수입니다.
"1924" 2 "94" "1231234" 3 "3234" "4177252841" 4 "775841"
풀이 :
첫번째 숫자가 클수록 더 큰 수이기 때문에 만약 3자리 수를 return 해야 한다면 끝에 2개의 숫자를 남겨두고 그 앞의 숫자들 중 가장 큰 수를 찾도록 했다.
예를 들어 1231234에서 k가 3이면 4자리 숫자를 return 해야 하는데 이 때 맨 끝에 234 숫자를 제외한 1231 중에서 가장 큰 수 인 3을 찾고, 그 후 이제 숫자 3자리를 채우면 되므로 맨 끝에 34를 남겨둔 후 3보다 뒤에 있는 12 중 큰 수 인 2를 찾고, 그 후 이제 숫자 두 자리를 채우면 되므로 맨 끝에 4를 남겨두고 2보다 뒤에 있는 수는 3 뿐이므로 3을 찾고, 그 후 나머지는 4밖에 없으므로 4를 넣어준다.
이를 간단히 정리하면
내가 만들어야 할 숫자의 자릿수는 h = number.length()-k 이다.
1. number[0] 부터 number[마지막 인덱스 - (h-1)] , 즉 인덱스 0부터 k까지의 수 중 가장 큰 수를 고른 후 그 수를 answer에 추가시킨 후 그 인덱스를 i라 하자.
(마지막 인덱스 - (h-1) = number.length - 1 - (number.length - k - 1)) = k 이다.)
2. number[i+1] ~ number[k++] 중 가장 큰 수를 고른 후 i = 가장 큰 수의 인덱스.
3. number[i+1] ~ number[k++] 중 가장 큰 수 고른 후 i = 가장 큰 수의 인덱스.
...
즉 2번 과정을 k가 number.length()-1 즉, 마지막 인덱스가 될 때까지 반복한다.
* 주의해야 할 점은 answer을 String 형태로 두고 거기에 큰 수를 찾을 때마다 넣어주게 되면 시간초과가 발생하므로 StringBuilder를 사용해서 추가해줘야 한다!!
아래에서 index를 -1로 초기화시킨 이유는 처음 for문을 돌 때 i가 0부터 시작해야하기 때문이다.
import java.util.*; class Solution { public String solution(String number, int k) { //String answer = ""; StringBuilder answer = new StringBuilder(); int max; int index = -1; while (k <= number.length() - 1) { max = 0; for (int i = index+1; i <= k; i++) { if (number.charAt(i)-'0' > max) { max = number.charAt(i)-'0'; index = i; } } answer.append(max); k++; } return answer.toString(); } }
'코딩테스트' 카테고리의 다른 글
프로그래머스 단속카메라(자바) - 그리디 (0) 2022.04.16 프로그래머스 섬 연결하기(자바) - 그리디 / 크루스칼 알고리즘** (0) 2022.04.14 프로그래머스 조이스틱(탐욕법 Greedy) - 자바 ** (0) 2022.04.12 프로그래머스 k번째 수(자바) - 정렬 -> 배열 복사 주의! (0) 2022.04.10 프로그래머스 가장 큰 수(자바) - 정렬 (0) 2022.04.07