알고리즘/깊이,너비함수(DFS,BFS)

여행경로 프로그래머스 lv3 (dfs,bfs)

임혁진 2024. 1. 31. 19:31

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
	//dfs 
	//모든 항공권 사용
	//알파벳 사전순
	//백트래킹 - 사전순으로 들어가다 모든 항공권 사용이 불가능 할 수 있따.
	static boolean visited[] ;
	static ArrayList<String> list = new ArrayList<>();
	static ArrayList<String> list1 = new ArrayList<>();
	static String[][] tickets;



	public String[] solution(String[][] tickets) {
		this.tickets = tickets;
		String[] answer = new String[tickets.length+1];

		list = new ArrayList<>();

		//사전순으로 정렬시켜주기
		Arrays.sort(tickets , (a,b) -> {
			if(a[0].equals(b[0])){
				return a[1].compareTo(b[1]);
			}else {
				return a[0].compareTo(b[0]);
			}
		});

		//초기화 
		visited = new boolean[tickets.length];

		list.add("ICN");
		dfs("ICN" ,list , 0);

		//list에 받아옴
		for(int i = 0 ; i <answer.length ; i++){
			answer[i] = list1.get(i);

		}


		return answer;
	}

	private static  void dfs(String boarding , ArrayList<String> alist , int dephts){
		list = new ArrayList<>();
		//dfs탈출 조건
		//백트래킹 탈출조건
		if(dephts== tickets.length){
			list1.addAll(alist);
			return;
		}
		//구현동작

		for(int i = 0 ; i < tickets.length ; i++){
			if(!visited[i] && boarding.equals(tickets[i][0])){
                visited[i] = true;
				list.addAll(alist);
				list.add(tickets[i][1]);
				dfs(tickets[i][1], list , dephts +1);
				visited[i] = false;
			}
		}
	}
}

처음에 bfs로 들어갔다가 모든 티켓을 쓰게하는 백트래킹을 구현하지못해 dfs로 구현했다.

백트래킹을 구현하기위해 dfs에 현재까지의 총 값(alist)와 탈출하기 위한 조건 dephts를 같이 매개변수로 들고갔다.