[백준] 1039: 교환 - JAVA

https://www.acmicpc.net/problem/1039

풀이

정수 N의 i번 위치와 j번 위치의 숫자를 바꿀 수 있다.

이 행위를 K번 반복할 때 최댓값을 구해야 한다.

위치를 바꿀 때 바꾼 수가 0으로 시작하면 안된다.

n번 수행했을 때 나온 수를 방문처리 하기 위해 이차원 배열로 방문처리했다.

bfs탐색을 통해 숫자와 바꾼 횟수를 저장해가면 진행했다.


메모리: 54616KB

시간: 244ms

언어: Java 11

코드

import java.io.*;
import java.util.*;

public class Main {
    static final int MAX = 1_000_001;
    static int answer;

    static class Node {
        int num;
        int cnt;

        public Node(int num, int cnt) {
            this.num = num;
            this.cnt = cnt;
        }
    }

    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());

        answer = -1;
        bfs(N, K);

        System.out.println(answer);
    }

    private static void bfs(int n, int k) {
        boolean[][] visited = new boolean[MAX][k + 1];

        Queue<Node> queue = new LinkedList<>();
        queue.add(new Node(n, 0));
        visited[n][0] = true;

        int len = String.valueOf(n).length();

        while (!queue.isEmpty()) {
            Node node = queue.poll();

            if (node.cnt == k) {
                answer = Math.max(node.num, answer);
                continue;
            }

            for (int i = 0; i < len - 1; i++) {
                for (int j = i + 1; j < len; j++) {
                    int newNumber = changeNum(node.num, i, j);

                    if (newNumber != -1 && !visited[newNumber][node.cnt + 1]) {
                        queue.add(new Node(newNumber, node.cnt + 1));
                        visited[newNumber][node.cnt + 1] = true;
                    }
                }
            }
        }
    }

    private static int changeNum(int num, int i, int j) {
        char[] numToCharArray = String.valueOf(num).toCharArray();

        char tmp = numToCharArray[i];
        numToCharArray[i] = numToCharArray[j];
        numToCharArray[j] = tmp;

        return numToCharArray[0] == '0' ? -1 : Integer.parseInt(new String(numToCharArray));
    }

}