From e15a6d995868ab8a286cf6c6775f1ceb76fd5577 Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:54:07 +0900 Subject: [PATCH] =?UTF-8?q?[20251014]=20BOJ=20/=20P4=20/=20=EC=88=98=20?= =?UTF-8?q?=EC=A7=80=EC=9A=B0=EA=B8=B0=20/=20=EC=9D=B4=EC=A2=85=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0 \354\247\200\354\232\260\352\270\260.md" | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 "0224LJH/202510/14 BOJ \354\210\230 \354\247\200\354\232\260\352\270\260.md" diff --git "a/0224LJH/202510/14 BOJ \354\210\230 \354\247\200\354\232\260\352\270\260.md" "b/0224LJH/202510/14 BOJ \354\210\230 \354\247\200\354\232\260\352\270\260.md" new file mode 100644 index 00000000..0a59c9a9 --- /dev/null +++ "b/0224LJH/202510/14 BOJ \354\210\230 \354\247\200\354\232\260\352\270\260.md" @@ -0,0 +1,103 @@ +```java +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Main { + + static int len; + static int[] arr,numCnt,eraseCnt; + static String ans; + + public static void main(String[] args) throws IOException { + init(); + process(); + print(); + } + private static void init() throws IOException{ + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + + String input = br.readLine(); + len = input.length(); + arr = new int[len]; + + numCnt = new int[10]; + for (int i = 0; i < len; i++) { + arr[i] = input.charAt(i) - '0'; + numCnt[arr[i]]++; + } + + String erase = br.readLine(); + eraseCnt = new int[10]; + for (int i = 0; i < erase.length(); i++) { + eraseCnt[erase.charAt(i) - '0']++; + } + } + + private static void process() { + // 남을 숫자 개수 + int[] remaining = new int[10]; + int totalRemain = 0; + for (int i = 0; i < 10; i++) { + remaining[i] = numCnt[i] - eraseCnt[i]; + totalRemain += remaining[i]; + } + + // suffix count 전처리 + int[][] suffixCnt = new int[len + 1][10]; + for (int i = len - 1; i >= 0; i--) { + for (int d = 0; d < 10; d++) { + suffixCnt[i][d] = suffixCnt[i + 1][d]; + } + suffixCnt[i][arr[i]]++; + } + + StringBuilder sb = new StringBuilder(); + int pos = 0; + + // 결과 길이만큼 반복 + for (int resultPos = 0; resultPos < totalRemain; resultPos++) { + // 가장 큰 숫자부터 시도 + for (int num = 9; num >= 0; num--) { + if (remaining[num] == 0) continue; + + // 원본에서 num을 찾기 + boolean found = false; + for (int i = pos; i < len; i++) { + if (arr[i] == num) { + // 이 num을 선택했을 때, i+1부터 나머지를 만들 수 있는지 확인 + remaining[num]--; + + boolean canMake = true; + for (int d = 0; d < 10; d++) { + if (suffixCnt[i + 1][d] < remaining[d]) { + canMake = false; + break; + } + } + + if (canMake) { + sb.append(num); + pos = i + 1; + found = true; + break; + } else { + remaining[num]++; + } + } + } + + if (found) break; + } + } + + ans = sb.toString(); + } + + + + private static void print() { + System.out.println(ans); + } +} +```