Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

hwooo

프로그래머스 (C/C++, Java) 43164 : 여행경로 본문

Study/Algorithm

프로그래머스 (C/C++, Java) 43164 : 여행경로

hwooo 2024. 12. 25. 20:44

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

 

프로그래머스

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

programmers.co.kr

 

풀이

처음엔 알파벳 순으로 정렬한 후 BFS로 탐색했으나, 이렇게 탐색할 경우 답이 없는 경우를 파악하기 어려웠다.

그래서 다른 사람의 풀이를 본 후, 알파벳 순으로 정렬 후 DFS로 탐색하며 답이 아니라면 백트래킹으로 탐색하는 방법을 사용했다.


C/C++ 코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool visited[20001];
vector<string> answer;

bool dfs(vector<vector<string>>& tickets, string now) {
    answer.push_back(now);
    for (int i = 0; i < tickets.size(); i++) {
        vector<string> t = tickets[i];
        if (t[0] == now && !visited[i]) {
            visited[i] = true;
            
            if (!dfs(tickets, t[1])) {
                visited[i] = false;
                answer.pop_back();
            }
        }
    }
    
    if (answer.size() != tickets.size() + 1)
        return false;
    return true;
}

vector<string> solution(vector<vector<string>> tickets) {
    sort(tickets.begin(), tickets.end());
    
    dfs(tickets, "ICN");
    return answer;
}

 

Java 코드

import java.util.*;

class Solution {
    
    List<String> answer = new ArrayList<>();
    boolean[] visited;

    boolean dfs(String[][] tickets, String now, int cnt) {
        answer.add(now);
        
        if (cnt == tickets.length + 1)
            return true;

        for (int i = 0; i < tickets.length; i++) {
            if (tickets[i][0].equals(now) && !visited[i]) {   
                visited[i] = true;
                if (dfs(tickets, tickets[i][1], cnt + 1)) 
                    return true;
                
                answer.remove(answer.size() - 1);
                visited[i] = false;
            }
        }
        return false;
    }
    
    public String[] solution(String[][] tickets) {
        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];
        
        dfs(tickets, "ICN", 1);
        return answer.toArray(new String[0]);
    }
}