[S/W 문제해결 기본] 4일차 - 길찾기

길찾기

길 중간 중간에는 최대 2개의 갈림길이 존재하고, 모든 길은 일방 통행으로 되돌아오는 것이 불가능하다.

다음과 같이 길이 주어질 때, A도시에서 B도시로 가는 길이 존재하는지 알아내는 프로그램을 작성하여라.

  • A와 B는 숫자 0과 99으로 고정된다.

  • 모든 길은 순서쌍으로 나타내어진다. 위 예시에서 2번에서 출발 할 수 있는 길의 표현은 (2, 5), (2, 9)로 나타낼 수 있다.

  • 가는 길의 개수와 상관없이 한가지 길이라도 존재한다면 길이 존재하는 것이다.

  • 단 화살표 방향을 거슬러 돌아갈 수는 없다.


풀이

배열을 2개 생성한 후 입력을 받을 때 이미 배열1에 값이 있다면 배열2에 저장하도록 구현한다.

배열 각각에 현재 번호에서 갈 수 있는 곳이 있다면 재귀를 통해 진행할 수 있도록 한다.

현재 번호가 99라면 ans의 값을 1로 바꿔준다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		for(int tc = 1; tc <= 10; tc++ ) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int N = Integer.parseInt(st.nextToken());
			int cnt = Integer.parseInt(st.nextToken());
			
			int[] road1 = new int[100];
			int[] road2 = new int[100];
			
			st = new StringTokenizer(br.readLine(), " ");
			
			for(int i = 0; i < cnt; i++) {
				int start = Integer.parseInt(st.nextToken());
				int end = Integer.parseInt(st.nextToken());
				
				if(road1[start] != 0) {
					road2[start] = end;
				}else {
					road1[start] = end;
				}
			}
			
			ans = 0;
			move(road1, road2, 0);
			System.out.println("#"+tc+" "+ans);
			
		}

	}
	
	static int ans;
	static void move(int[] road1, int[] road2, int now) {
		if(now == 99) {
			ans = 1;
			return;
		}
		
		if(road1[now] != 0) {
			move(road1, road2, road1[now]);
		}
		if(road2[now] != 0) {
			move(road1, road2, road2[now]);
		}
		
	}

}