-
1963 : 소수 경로Solve Algorithms/BFS, DFS 2020. 5. 3. 20:55728x90
출처 : 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배열에 방문여부를 반영한다.
코드
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;elsebreak;}}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}}}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