λ°˜μ‘ν˜•
Notice
Recent Posts
Recent Comments
Link
Β«   2025/03   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
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
Archives
Today
Total
03-11 02:22
관리 메뉴

ImJay

[BOJ/Java] 1039. κ΅ν™˜ λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/BOJ - Java

[BOJ/Java] 1039. κ΅ν™˜

ImJay 2025. 3. 10. 10:02
λ°˜μ‘ν˜•

πŸ“Œ [BOJ/Java] 1039. κ΅ν™˜


πŸ’‘ 문제 해석

μžμ—°μˆ˜ N(μ΅œλŒ€ 1,000,000)κ³Ό κ΅ν™˜ 횟수 K(μ΅œλŒ€ 10)κ°€ 주어진닀.
숫자 N의 각 자릿수λ₯Ό μ •ν™•νžˆ K번 κ΅ν™˜ν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 수λ₯Ό ꡬ해야 ν•œλ‹€.
단, 0으둜 μ‹œμž‘ν•˜λŠ” μˆ«μžλŠ” λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ, κ΅ν™˜ κ²°κ³Όκ°€ 0으둜 μ‹œμž‘ν•˜λ©΄ ν•΄λ‹Ή κ²½μš°λŠ” μ œμ™Έν•΄μ•Ό ν•œλ‹€.

예λ₯Ό λ“€μ–΄,
βœ… N = 132, K = 1일 λ•Œ → (312, 231) 쀑 312κ°€ μ΅œλŒ€
βœ… N = 100, K = 1일 λ•Œ → κ°€λŠ₯ν•œ κ΅ν™˜μ΄ μ—†μœΌλ―€λ‘œ -1

문제의 핡심은 BFS(λ„ˆλΉ„ μš°μ„  탐색)λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€λŠ₯ν•œ λͺ¨λ“  숫자 쑰합을 νƒμƒ‰ν•˜λŠ” 것이닀.


πŸ“ 풀이 κ³Όμ •

1️⃣ BFSλ₯Ό ν™œμš©ν•œ μ™„μ „ 탐색

  • ν˜„μž¬ 숫자 μƒνƒœλ₯Ό Queue에 μ €μž₯ν•˜κ³ , Set을 ν™œμš©ν•΄ λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ²΄ν¬ν•œλ‹€.
  • K번 λ™μ•ˆ λͺ¨λ“  κ°€λŠ₯ν•œ 숫자 쑰합을 μƒμ„±ν•˜μ—¬ νƒμƒ‰ν•œλ‹€.
  • 맀 λ°˜λ³΅λ§ˆλ‹€ κ°€λŠ₯ν•œ λͺ¨λ“  자리 κ΅ν™˜μ„ μˆ˜ν–‰ν•œλ‹€.

2️⃣ 숫자 κ΅ν™˜ 둜직

  • λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ 두 자리 숫자λ₯Ό κ΅ν™˜ν•œλ‹€.
  • κ΅ν™˜ ν›„ 0으둜 μ‹œμž‘ν•˜λŠ” 경우 μ œμ™Έν•œλ‹€.

3️⃣ μ΅œλŒ€ 숫자 μ°ΎκΈ°

  • K번의 κ΅ν™˜μ΄ λλ‚œ ν›„, 남아 μžˆλŠ” μˆ«μžλ“€ 쀑 κ°€μž₯ 큰 값을 좜λ ₯ν•œλ‹€.
  • λ§Œμ•½ μœ νš¨ν•œ μˆ«μžκ°€ μ—†λ‹€λ©΄ -1 좜λ ₯

πŸ’» μ½”λ“œ (Java)

import java.util.*;

public class Main {
    static int N, K;
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        K = sc.nextInt();
        
        System.out.println(bfs());
    }
    
    private static int bfs() {
        Queue<String> queue = new LinkedList<>();
        queue.offer(String.valueOf(N));
        
        for (int k = 0; k < K; k++) {
            Set<String> visited = new HashSet<>();
            int size = queue.size();
            
            for (int i = 0; i < size; i++) {
                String cur = queue.poll();
                
                for (int x = 0; x < cur.length(); x++) {
                    for (int y = x + 1; y < cur.length(); y++) {
                        char[] arr = cur.toCharArray();
                        
                        // 자리 λ°”κΎΈκΈ°
                        char temp = arr[x];
                        arr[x] = arr[y];
                        arr[y] = temp;
                        
                        // κ΅ν™˜ ν›„ μˆ«μžκ°€ 0으둜 μ‹œμž‘ν•˜λ©΄ μ œμ™Έ
                        if (arr[0] == '0') continue;
                        
                        String next = new String(arr);
                        
                        // μ€‘λ³΅λœ 경우 λ°©λ¬Έ X
                        if (!visited.contains(next)) {
                            visited.add(next);
                            queue.offer(next);
                        }
                    }
                }
            }
            
            // κ΅ν™˜μ„ ν–ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  더 이상 탐색할 수 μ—†μœΌλ©΄ -1 λ°˜ν™˜
            if (queue.isEmpty()) return -1;
        }
        
        int maxVal = -1;
        while (!queue.isEmpty()) {
            maxVal = Math.max(maxVal, Integer.parseInt(queue.poll()));
        }
        return maxVal;
    }
}

⏱ μ‹œκ°„ λ³΅μž‘λ„ 뢄석

  • BFS 탐색을 μ‚¬μš©ν•˜λ©°, μ΅œλŒ€ K=10번 반볡
  • 숫자 κ΅ν™˜ μ‹œ, μ΅œλŒ€ O(L^2) (L은 숫자의 자릿수, μ΅œλŒ€ 6)
  • μ΅œμ•…μ˜ 경우 O(K × L^2) ≈ O(10 × 36) = O(360) → μΆ©λΆ„νžˆ ν•΄κ²° κ°€λŠ₯

🧐 λŠλ‚€ 점

  • λ‹¨μˆœν•œ 브루트포슀 λ°©μ‹μœΌλ‘œλŠ” 해결이 μ–΄λ €μš΄ λ¬Έμ œμ˜€λ‹€.
  • BFSλ₯Ό ν™œμš©ν•˜μ—¬ κ΅ν™˜ 과정을 λ‹¨κ³„λ³„λ‘œ μ§„ν–‰ν•˜λŠ” 것이 ν•΅μ‹¬μ΄μ—ˆλ‹€.
  • 숫자λ₯Ό λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ‹€λ£¨λŠ” 방식이 자주 μ‚¬μš©λ˜λ―€λ‘œ μ΅μˆ™ν•΄μ Έμ•Όκ² λ‹€.
  • 0으둜 μ‹œμž‘ν•˜λŠ” 숫자λ₯Ό λ°°μ œν•˜λŠ” 쑰건을 λ†“μΉ˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Όκ² λ‹€.
λ°˜μ‘ν˜•
Comments