| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- dfs
- Stack
- BFS
- 자바
- 프로그래머스
- 다이나믹프로그래밍
- level3
- 컴퓨터 비전
- 코틀린
- 동적계획법
- 통신 인터페이스
- kotlin
- 백준
- level2
- 2018 KAKAO BLIND RECRUITMENT
- 우선순위큐
- lv2
- c++
- 다이나믹 프로그래밍
- 그리디
- 임베디드
- dp
- cpp
- C
- JavaScript
- 컴퓨터비전
- java
- 누적합
- 구현
- 이분탐색
Archives
- Today
- Total
코드를 느껴바라
2812번 : 크게 만들기 [JAVA] 본문
문제링크
성공 여부(걸린 시간): 성공(43분)
아이디어
이 문제는 길이가 N인 수에서 K개의 숫자를 제거해 가장 큰 수를 만드는 문제이다. 핵심은 앞에서부터 가능한 한 큰 숫자를 남기기 위해 작은 숫자를 우선적으로 제거하는 것이다.
먼저 입력받은 숫자를 큐에 차례대로 저장한다. 결과를 담을 자료구조로는 스택처럼 동작할 수 있는 Deque를 사용한다.
숫자를 앞에서부터 하나씩 확인하면서, 현재 숫자가 다음 숫자보다 크거나 같다면 결과에 넣는다. 하지만 현재 숫자가 다음 숫자보다 작다면 뒤에 더 큰 숫자가 있다는 의미이므로 현재 숫자를 제거하고 K를 하나 줄인다. 이 과정을 K가 0이 되거나 큐가 빌 때까지 반복한다.
그 후 큐에 남은 숫자들을 결과에 넣어주고, 만약 아직 K를 다 쓰지 못했다면 이는 이미 앞부분이 모두 내림차순이 된 경우이므로 뒤에서부터 K개를 잘라낸다.
이 과정을 거치면 앞자리부터 큰 수가 최대한 유지되면서 전체적으로 가장 큰 수를 얻을 수 있다.
왼큰 수 + 뒤에 잘라내는 로직 문제인듯
풀이코드
import java.io.*;
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 N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
String num = br.readLine();
if(N+K==2){
System.out.print(0);
return;
}
ArrayDeque<Integer> q = new ArrayDeque<>();//뽑아서 하나씩 확인할 큐
ArrayDeque<Integer> result = new ArrayDeque<>();//결과로 출력할 스택
for(char x: num.toCharArray()){
q.add(x-'0');
}
while (K!=0&&!q.isEmpty()){
int cur = q.poll();
if(q.isEmpty()){
result.add(cur);
break;
}
if(cur>=q.peekFirst()){
result.add(cur);
}
else {
while(--K!=0&&!result.isEmpty()&&result.peekLast()<q.peekFirst()){
result.pollLast();
}
}
}
while (!q.isEmpty()){//q에 남은거 result에 넣어주기
result.add(q.poll());
}
for(int i=0; i<K; i++){//K가 0이 안되었는데 끝났다-> 전부 왼큰수가 되었다면 뒤에서부터 남은 K 횟수만큼 pollLast 해줌
result.pollLast();
}
for(int x:result){
System.out.print(x);
}
}
}반응형
'PS > 백준(Baekjoon)' 카테고리의 다른 글
| 1092번 : 배 [JAVA] (0) | 2025.10.10 |
|---|---|
| 15486 : 퇴사 2 [JAVA] (0) | 2025.09.30 |
| 16437번 : 양 구출 작전 [JAVA] (0) | 2025.09.19 |
| 3109번 : 빵집 [JAVA] (0) | 2025.09.18 |
| 16920번 : 확장 게임 [JAVA] (0) | 2025.09.08 |
