728x90
https://www.acmicpc.net/problem/2812
2812번: 크게 만들기
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int digit = Integer.parseInt(st.nextToken());
int canErase = Integer.parseInt(st.nextToken());
String value = br.readLine();
Deque<Integer> deque = new ArrayDeque<>();
for (int i=0; i<digit; i++) {
int val = Integer.parseInt(String.valueOf(value.charAt(i)));
if (canErase ==0) {
deque.addLast(val);
continue;
}
if (deque.size() == 0) {
deque.add(val);
continue;
}
while (deque.size() > 0 && deque.getLast() < val && canErase != 0) {
deque.removeLast();
canErase--;
}
deque.addLast(val);
}
while (canErase != 0) {
deque.pollLast();
canErase--;
}
StringBuilder sb = new StringBuilder();
for (Integer element : deque)
sb.append(element.toString()).append("");
System.out.println(sb.toString().trim());
}
}
- string에서 하나씩 떼서 그 값을 deque 안에 값과 비교할 것이다
- 만약 지울 수 있는 횟수를 초과했으면 그냥 deque 안에 더한다
- deque안에 값이 없으면 그냥 추가한다
- 만약 deque 맨 뒷 값이 현재 값보다 작으면 해당값을 poll해서 없애고 canErase를 하나 줄인다
- 지우는 횟수를 모두 사용하지 못했는데 string에서 모두 뗀 상태라면 남은 지우는 횟수만큼 poll해서 없애버린다
- StringBuilder로 deque 에 있는 요소들을 string으로 만들어준다
많이 틀린 이유
여기서 StringBuilder를 사용하지 않고 string에 += 하는 방식을 사용하면 메모리초과가 난다.
계속 새로운 리터럴이 만들어지기 때문이다. ㅜㅜ
이걸 모르고 계속 더하는 방법을 사용해서 꽤 많이 틀렸다. 이전에는 이 방법을 써도 메모리초과가 나지 않아서 심각성을 몰랐던 것 같다.
앞으로는 StringBuilder를 자주 사용해야지.

728x90
'알고리즘 > 백준' 카테고리의 다른 글
| [Java] 백준 14496 그대, 그머가 되어 - 실버2 (0) | 2023.07.15 |
|---|---|
| [Java] 백준 14248 점프 점프 - 실버2 (0) | 2023.07.15 |
| [Java] 백준 2109 순회강연 - 골드3 (0) | 2023.07.14 |
| [Java] 백준 13975 파일 합치기 3 - 골드4 (0) | 2023.07.14 |
| [Java] 백준 1744 수 묶기 - 골드4 (0) | 2023.07.14 |