[프로그래머스] 여행경로 JAVA

AMUD·2023년 6월 19일
1

Algorithm

목록 보기
68/78

문제


문제링크

접근

  • 백트래킹 그림만 그려지면 금방 풀리는 문제이다.
  • 방문 여부를 포함하고 있는 간선 클래스를 통해 <도시이름-간선리스트> 형태로 map을 구성하여 dfs, 백트래킹을 이어갔다.
  • map을 사용할 때 항상 get이 null을 반환하는지를 조심하자!

풀이

import java.util.*;

class Solution {
    Map<String, List<Edge>> edges = new HashMap<>();
    Deque<String> stk = new ArrayDeque<>();
    int tCnt = 0;
    List<String> answer = null;
    
    public List<String> solution(String[][] tickets) {
        tCnt = tickets.length;
        
        for (String[] t : tickets) {
            if (!edges.containsKey(t[0])) edges.put(t[0], new LinkedList<>());
            edges.get(t[0]).add(new Edge(t[1]));
        }
        for (String key : edges.keySet()) Collections.sort(edges.get(key));
        
        dfs("ICN", 0);
        
        return answer;
    }
    
    public void dfs(String start, int depth) {
        if (answer != null) return;

        if (depth == tCnt) {
            answer = new LinkedList<>();
            answer.add("ICN");
            while(!stk.isEmpty()) answer.add(stk.removeLast());
            return;
        }
        
        if (!edges.containsKey(start)) return;
        for (Edge next : edges.get(start)) {
            if (next.visited) continue;
            next.visited = true;
            stk.push(next.end);
            
            dfs(next.end, depth + 1);
            if (answer != null) return;
            
            next.visited = false;
            stk.pop();
        }
        
    }
    
    class Edge implements Comparable<Edge>{
        String end;
        boolean visited = false;
        
        public Edge(String end) {
            this.end = end;
        }
        
        @Override
        public String toString() {
            return this.end;
        }
        
        @Override
        public int compareTo(Edge e) {
            return this.end.compareTo(e.end);
        }
    }
    
}
profile
210's Velog :: Ambition Makes Us Diligent

0개의 댓글