문제
어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.
제한 조건
- number는 1자리 이상, 1,000,000자리 이하인 숫자입니다.
- k는 1 이상 number의 자릿수 미만인 자연수입니다.
나의 코드
class Solution {
public static String solution(String number, int k) {
String[] arr1 = number.split("");
int[] arr = new int[arr1.length];
for(int i=0; i<arr.length; i++) { arr[i] = Integer.parseInt(arr1[i]); }
int cnt = arr.length-k;
int left = 0;
int right = k+1;
StringBuilder sb = new StringBuilder();
while(cnt>0) {
int max = 0;
for(int i=left; i<right; i++) {
if(arr[i]>max) {
max = arr[i];
left=i+1;
}
}
sb.append(max);
right++; cnt--;
}
return sb.toString();
}
}
나의 풀이
탐욕법 알고리즘의 이름에 걸맞게 그 순간순간의 최댓값을 구해서 수를 완성시키면 된다.
테스트 케이스 10번에서 계속 시간 초과가 떠서 진짜 너무 답답했지만 number를 parsing 한 값들을 String으로 들고 int와
비교해줄 때마다 Integer.parseInt()를 사용해서 그런 것이었다. 그래서 그냥 처음부터 int[] array에 Integer.parseInt로 int로 가지고 있는다.
1. 우선 문자열 number를 parsing 하여 arr1 array에 저장한다.
2. int[] array를 선언하고 크기는 arr1.length로 해준다.
3. for문을 통해 String Array에 들어있는 값들을 int Array에 옮겨준다 ( Integer.parseInt를 통해 )
4. int cnt는 while문을 제어할 카운터 변수이다.
5. int left 와 right는 Array의 왼쪽 index와 index가 오른쪽으로 몇 번 움직일지(right)를 판단해줄 변수이다.
6. int right의 초기값은 인자로 넘어온 k에 +1 해준 값으로 설정해준다. (arr [left]에서 right-left번 반복한다가 된다)
6. StringBuilder는 while문이 한번 돌 때마다 나오는 값을 append시켜주는데 그냥 String을 쓰는 것보다 효율적이라고 해서 사용
7. while문이 시작되면 int max를 초기화시켜준다. (max는 매 순간순간의 최댓값이 저장된다)
8. for문을 통해 left부터 right까지의 값 중에 최댓값을 if문을 통해 찾아낸다.
9. 최댓값의 index를 찾았다면 그다음부터 탐색해야 하기 때문에 left=i+1이 된다.
10. for문이 끝나고 max가 도출되면 StringBuilder sb에 append 시켜준다.
11. right는 한 칸 늘려주고 cnt는 한번 빼준다.
12. return type이 String이기 때문에 return sb.toString()으로 마무리한다.
'코딩테스트 풀이 > 프로그래머스' 카테고리의 다른 글
탐욕법 - 구명보트 [JAVA] (0) | 2020.07.09 |
---|---|
탐욕법 - 체육복 [JAVA] (0) | 2020.06.15 |
완전탐색 - 카펫 [JAVA] (0) | 2020.06.12 |
완전탐색 - 숫자 야구 [JAVA] (0) | 2020.06.11 |
완전탐색 - 소수 찾기 [JAVA] - 풀이 미완성 (0) | 2020.06.09 |