728x90
https://www.acmicpc.net/problem/2812
2812번: 크게 만들기
N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
[코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.ArrayDeque;
import java.util.Deque;
public class bj2812 {
static int N;
static int K;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
String str = br.readLine();
Deque<Character> dq = new ArrayDeque<>();
for (int i = 0; i < N; i++) {
System.out.println(str.charAt(i));
while(K>0 && !dq.isEmpty() && dq.getLast() < str.charAt(i)) {
dq.removeLast();
K--;
}
dq.addLast(str.charAt(i));
}
for (int i = 0; i < dq.size(); i++){
sb.append(dq.removeFirst()); i--; }
System.out.println(sb);
}
}
|
cs |
[풀이]
맨 처음에는 내림차순으로 정렬한 후 K개만큼 가장 작은 숫자들을 리스트의 index를 유지하면서 지워나갔다.
예제 3번에서 장렬하게 틀리고 생각을 해보았다.... 뭐가 틀렸을까 싶었는데
인덱스를 유지하면서 비교해가면서 지워야겠다고 생각했다.
dq에서 맨 뒤 원소를 지우기 위한 조건 : * 일단 덱을 한바퀴 도는 과정은 str의 원소 순서와 같이 간다.
1. 아직 원소 2개를 모두 지우지 않았어야 한다. (K 이상으로 지우면 안됨)
2. 덱이 비면 안된다. (맨 첫번째에는 뺄게 없으니)
3. 덱의 마지막 원소보다 현재 추가할 원소가 커야한다. (그래야 추가했을때 숫자가 더 커지므로)
대충 이런식으로 작동
그리고 마지막에 stringbuilder로 합쳐준다. 끝!
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[Java] 10775 공항 - Union, Find (0) | 2022.02.06 |
---|---|
[Java] 7569 토마토 - BFS (0) | 2022.01.30 |
[JAVA] 1043 거짓말 (0) | 2022.01.30 |
[Java] 2456 나는 학급회장이다 - 정렬 (0) | 2022.01.27 |
[Java] 10988 팰린드롬인지 확인하기 - Substring (0) | 2022.01.26 |
댓글