CS & Algorithm/Algorithm

[Programmers:DFS/BFS] 여행경로

eunkonge 2026. 7. 6. 11:13 댓글 0

❓문제

주어진 항공권을 모두 이용한 여행 경로(여러 개일 경우 알파벳 순으로)

 


🖐️손코딩

Tickets을 인덱스 기준으로 사전순으로 정렬 => 항상 사전순임을 보장

bfs(curNode){
	for(i: 0 ~ tickets 수)
    	if(visited[i] == false)
        	if(curNode[1] == Tickets[i][0])
            	answer.add(Tickets[i])
                curNode = Tickets[i]
                bfs(curNode)
                answerlist.remove
                visited[i] = false
            
}

main{
	tickets을 오름차순으로 정렬
    
    for(i: 0 ~ tickets 수)
    	if(ICN에서 출발하는 티켓)
        	visited[i] = true
            bfs(tickets[i])
            answerlist.remove
            visited[i] = false
            
}

 


👩‍💻구현 코드

import java.util.*;

class Solution {
    boolean[] visited;
    String[][] inputs;
    ArrayList<String[]> answerlist;
    
    private boolean dfs(String[] curNode){
        if(answerlist.size() == inputs.length){
            return true; // 모든 티켓을 사용
        }
        
        for(int i = 0; i<inputs.length; i++){
            if(!visited[i]){
                if(curNode[1].equals(inputs[i][0])){
                    visited[i] = true;
                    answerlist.add(inputs[i]);
                    
                    if(dfs(inputs[i])){
                        return true;
                    }
                    
                    answerlist.remove(answerlist.size()-1);
                    visited[i] = false;
                }
            }
            
        }
        
        return false;
    }
    
    public String[] solution(String[][] tickets) {
        visited = new boolean[tickets.length];
        answerlist = new ArrayList<>();
        
        Arrays.sort(tickets,(a,b) -> {
            if(a[0].equals(b[0])){
                return a[1].compareTo(b[1]);
            }
            
            return a[0].compareTo(b[0]);
        });
        
        inputs = tickets;
        
        for(int i = 0; i<inputs.length; i++){
            if(inputs[i][0].equals("ICN")){
                visited[i] = true;
                answerlist.add(inputs[i]);
                
                if(dfs(inputs[i])){
                    break;
                }

                answerlist.remove(answerlist.size()-1);
                visited[i] = false;
            }
        }
        
        
        String[] answer = new String[answerlist.size()+1];
        
        answer[0] = answerlist.get(0)[0];
        
        for(int i = 0; i<answerlist.size(); i++){
            answer[i+1] = answerlist.get(i)[1];
        }
        
        
        return answer;
    }
}

 

1. BFS를 boolean으로 리턴하는 이유: 정답을 찾으면 즉시 탐색을 끝내기 위해

//void 였다면

ICN
├── A
│   └── ...
└── B
    └── 정답
    
정답을 찾았더라도 DFS(A) DFS(B) 처럼 모든 경우를 끝까지 탐색하게 됨!!

 

2. 테스트1 런타임 에러가 뜬 이유: 

curNode = inputs[i] 로 재귀 함수 안의 기준점인 curNode를 바꿔버려서 백트래킹을 하게 되면 엉뚱한 값을 기준으로 비교하게 됨 => DFS가 무한 루프에 빠져 스택 오버플로우 에러가 발생!!


https://school.programmers.co.kr/learn/courses/30/lessons/43164

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

 

 

'CS & Algorithm > Algorithm' 카테고리의 다른 글

[구현] 행렬 테두리 회전하기  (0) 2026.07.25
[BFS] 석유 시츄  (0) 2026.07.25
[Programmers:DP] 도둑질  (0) 2026.07.01
[Programmers:DP] 사칙연산  (0) 2026.07.01
[Programmers:DP] 등굣길  (0) 2026.06.30

많이 읽은 글