Sangil's blog

https://github.com/ChoiSangIl Admin

프로그래머스 코딩테스트 DFS/BFS 여행경로 JAVA DEV / ALGORITHM

2021-10-15 posted by sang12


어떤문제

일까? (출처:https://programmers.co.kr/learn/courses/30/lessons/43164)

해당 문제는 항공권 정보가 담긴 2차원 배열 TICKETS가 주어지고, 항공권을 사용해서 공항을 경유하는 경로를 찾는 문제이다. 이때 모든 항공권을 다 사용해야 하고, 알파벳 순서가 앞서는 경로를 찾아야 한다.

어떻게

풀었을까?

아래와 같이 티켓 {{"ICN", "SFO"}, {"ICN", "ATL"}, {"SFO", "ATL"}, {"ATL", "ICN"}, {"ATL","SFO"}}이 주어 졌을 때, ICN 을 시작으로 전체 항공권을 사용 할 수 있는 경우를 LEVEL6까지 탐색하면 항공권을 전체 다 사용 할 수 있는 경우를 구할 수 있다. 해당 문제를 보고 이 그림을 떠올리는게 문제를 푸는 핵심이였던거 같다.

사진을 보면 모든 항공권을 사용 할 수 있는 경우는 3가지 경우가 있다는 것을 알 수 있다. 
1. ICN->SFO->ATL->ICN->ATL->SFO
2. ICN->ATL->ICN->SFO->ATL->SFO
3. ICN->ATL->SFO->ATL->ICN->SFO

이때, 경로가 같을 경우 알파벳 순으로 지정한다고 했으니 답은 2번이 된다. 트리를 생각하는거에 + 정렬순서를 둠으로 문제가 더욱 까다러웠던거 같다. 정렬을 생각하며 다른길로 샐수도... 저와같이..ㅎ

코드(https://github.com/ChoiSangIl/algorithm/tree/master/BFS%2CDFS/programmers_C30_L43164_%EC%97%AC%ED%96%89%EA%B2%BD%EB%A1%9C)
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

class A211015 {
    static ArrayList<String> result = new ArrayList<String>();
    
    public static void main(String[] args) {
    	String[][] tickets = {{"ICN", "SFO"}, {"ICN", "ATL"}, {"SFO", "ATL"}, {"ATL", "ICN"}, {"ATL","SFO"}};
    	A211015 s = new A211015();
    	System.out.println(Arrays.toString(s.solution(tickets)));
    }
    
    public String[] solution(String[][] tickets) {
        //방문경로를 저장하기위한 배열
        Boolean[] visited = new Boolean[tickets.length];
	Arrays.fill(visited, Boolean.FALSE);
        //깊이탐색 시작
	dfs(visited, "ICN", "", tickets, 0);
        //알파벳순서로 가장 빠른 경로를 가져오기 위한 정렬
        Collections.sort(result);
        
        String[] answer = result.get(0).split(",");
        return answer;
    }
    
    static void dfs(Boolean[] visited, String station, String path, String[][] tickets, int index)  {
		if("".equals(path)) {
			path = station;
		}else {
			path = path + ","+ station;
		}		
		
		if(index == tickets.length) {
			result.add(path);
		}
		
		for(int i=0; i<tickets.length; i++) {
                        //사용하지 않은 티켓이고 가는 경로가 있을 경우
			if(!visited[i] && tickets[i][0].equals(station)) {
				visited[i] = true;
				dfs(visited, tickets[i][1], path, tickets, index+1);
				visited[i] = false;
			}
		}
	}
}

REPLY