ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1963 : 소수 경로
    Solve Algorithms/BFS, DFS 2020. 5. 3. 20:55
    728x90

    출처 : https://www.acmicpc.net/problem/1963


    문제

    소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데:

    • “이제 슬슬 비번 바꿀 때도 됐잖아”
    • “응 지금은 1033으로 해놨는데... 다음 소수를 무엇으로 할지 고민중이야"
    • “그럼 8179로 해”
    • “흠... 생각 좀 해볼게. 이 게임은 좀 이상해서 비밀번호를 한 번에 한 자리 밖에 못 바꾼단 말이야. 예를 들어 내가 첫 자리만 바꾸면 8033이 되니까 소수가 아니잖아. 여러 단계를 거쳐야 만들 수 있을 것 같은데... 예를 들면... 1033 1733 3733 3739 3779 8779 8179처럼 말이야.”
    • “흠...역시 소수에 미쳤군. 그럼 아예 프로그램을 짜지 그래. 네 자리 소수 두 개를 입력받아서 바꾸는데 몇 단계나 필요한지 계산하게 말야.”
    • “귀찮아”

    그렇다. 그래서 여러분이 이 문제를 풀게 되었다. 입력은 항상 네 자리 소수만(1000 이상) 주어진다고 가정하자. 주어진 두 소수 A에서 B로 바꾸는 과정에서도 항상 네 자리 소수임을 유지해야 하고, ‘네 자리 수’라 하였기 때문에 0039 와 같은 1000 미만의 비밀번호는 허용되지 않는다.

    입력

    첫 줄에 test case의 수 T가 주어진다. 다음 T줄에 걸쳐 각 줄에 1쌍씩 네 자리 소수가 주어진다.

    출력

    각 test case에 대해 두 소수 사이의 변환에 필요한 최소 회수를 출력한다. 불가능한 경우 Impossible을 출력한다.


    접근

    • 수가 소수인지 아닌지를 판단하는, PRIME 함수를 만든다. 
    • 이중for문을 이용하여, 각 자리별로 0부터 9까지 비교하여, 소수를 가려내고, visit배열에 방문여부를 반영한다. 

    코드

    import java.io.*;
    import java.util.*;
     
    public class Main {
     
        static int[] visit;
     
        public static int PRIME(int num) {
            int prime = -1;
            for (int i = 2; i <= num; i++) {
                if (num % i == 0) {
                    if (num == i)
                        prime = num;
                    else
                        break;
                }
            }
            return prime;
        }
     
        public static void BFS(int X, int D) {
            Queue<Integer> q = new LinkedList<Integer>();
            q.add(X);
            visit[X] = 1;
     
            while (!q.isEmpty()) {
                if(visit[D]!=0) {
                    return ;
                }
                X = q.poll();
                for (int i = 0; i < 4; i++) {
                    for (int j = 0; j <= 9; j++) {
                        
                        int nextX = (1000 * j) + X % 1000;
                        if (nextX >= 1000 && nextX < 10000 && PRIME(nextX) != -1) {
                            if (visit[nextX] == 0) {
                                q.add(nextX);
                                visit[nextX] = visit[X] + 1;
                            }
                        }
     
                        nextX = (100 * j) + ((X / 1000* 1000 + X % 100);
                        if (nextX >= 1000 && nextX < 10000 && PRIME(nextX) != -1) {
                            if (visit[nextX] == 0) {
                                q.add(nextX);
                                visit[nextX] = visit[X] + 1;
                            }
                        }
     
                        nextX = (10 * j) + ((X / 100* 100 + X % 10);
                        if (nextX >= 1000 && nextX < 10000 && PRIME(nextX) != -1) {
                            if (visit[nextX] == 0) {
                                q.add(nextX);
                                visit[nextX] = visit[X] + 1;
                            }
                        }
     
                        nextX = (1 * j) + ((X / 10* 10);
                        if (nextX >= 1000 && nextX < 10000 && PRIME(nextX) != -1) {
                            if (visit[nextX] == 0) {
                                q.add(nextX);
                                visit[nextX] = visit[X] + 1;
                            }
                        }
                    }
                }
            }
     
            visit[D] = -1;
            return;
        }
     
        public static void main(String[] args) throws IOException {
     
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
     
            int[] ans = new int[Integer.parseInt(br.readLine())];
     
            for (int i = 0; i < ans.length; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine(), " ");
                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());
     
                if (a == b) {
                    ans[i] = 0;
                } else {
                    visit = new int[10000];
                    BFS(a, b);
                    ans[i] = visit[b] - 1;
                }
            }
     
            for (int i = 0; i < ans.length; i++) {
                if (ans[i] == -2)
                    bw.write("impossible\n");
                else
                    bw.write(ans[i] + "\n");
            }
     
            bw.flush();
            br.close();
        }
    }
    728x90

    'Solve Algorithms > BFS, DFS' 카테고리의 다른 글

    프로그래머스 : 네트워크  (0) 2020.05.10
    프로그래머스 : 타겟 넘버  (0) 2020.05.09
    9019 : DSLR  (0) 2020.05.03
    5014 : 스타트링크  (0) 2020.05.03
    6593 : 상범 빌딩  (0) 2020.05.03

    댓글

kxmjhwn@gmail.com