-
[KOITP] 소수 경로자료구조 및 알고리즘/문제풀이 2016. 12. 19. 09:32
출처 : http://koitp.org/problem/PRIMEPATH/read/
시간 제한 메모리 제한 제출 횟수 정답 횟수 (비율) 정답자 수 1.0 초 512 MB 876 387 (44%) 321 < Comment >
이전의 문제에 이어서 BFS 문제입니다. 사실 풀었다고 하기에도 조금 찝찝한 기분인데, DFS나 BFS를 잘 익혀두었다면 별 걱정을 안 했을텐데라는 생각도 듭니다. 이론으로만 기억하고 실제 구현을 별로 안 하다보니 늘 헷갈리는 부분이 있는 듯 합니다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class PrimeAlarm { public static int T = 0; public static boolean isPrime[] = null; public static boolean isVisited[] = null; public static int D[] = null; public static Queue<Integer> queue = new LinkedList<Integer>(); public static boolean isPrime(int num) { if (num == 1 || num == 2) { return true; } for (int i = 2 ; i < num ; i++) { if (num % i == 0) { return false; } } return true; } public static void BFS (int n) { isVisited[n] = true; queue.add(n); int curr = 0; while (!queue.isEmpty()) { curr = queue.poll(); for (int i = 0 ; i < 4 ; i++) { for (int j = 0 ; j < 10 ; j++) { if(i == 3 && j == 0) { continue; // 첫번째 자리는 0이들어가는 것이 불가능하므로 } int num = (int) Math.pow(10, i); int next = curr - ((curr / num) % 10 * num) + j*num; if(isPrime[next] && !isVisited[next]) { isVisited[next] = true; queue.add(next); D[next] = D[curr] + 1; } } } } } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int start = 0; int end = 0; T = Integer.parseInt(br.readLine()); StringTokenizer st = null; // 일단 범위 내의 모든 소수를 구하고, BFS, Queue 이용, visited 배열을 만들어 처리 isPrime = new boolean[10000]; for (int i = 1000 ; i < 10000 ; i++) { if (isPrime(i)) { isPrime[i] = true; } else { isPrime[i] = false; } } for (int tc = 0 ; tc < T ; tc++) { isVisited = new boolean[10000]; D = new int[10000]; st = new StringTokenizer(br.readLine()); start = Integer.parseInt(st.nextToken()); end = Integer.parseInt(st.nextToken()); BFS(start); bw.write("" + D[end] + "\n"); bw.flush(); } bw.close(); } }