알고리즘

[프로그래머스] 여행경로 (C/C++)

Code Bomber 2020. 12. 30. 08:15

문제 링크 : programmers.co.kr/learn/courses/30/lessons/43164

 

코딩테스트 연습 - 여행경로

[[ICN, SFO], [ICN, ATL], [SFO, ATL], [ATL, ICN], [ATL,SFO]] [ICN, ATL, ICN, SFO, ATL, SFO]

programmers.co.kr

전형적인 DFS 방식으로 문제를 풀었다.

visited를 tickets+1의 크기만큼 만들고 visited와 answer를 참조로 받아 DFS 방식으로 돌렸다.

 

#include <string>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;

bool dfs(string here, vector<int>& visited, vector<vector<string>> tickets, vector<string>& answer) {
	answer.push_back(here);

    for(vector<vector<string>>::iterator iter = tickets.begin(); iter != tickets.end(); iter++) {
        int idx = iter - tickets.begin();
        
        if(visited[idx] == false && (*iter)[0] == (*(answer.end() - 1))) {
            visited[idx] = true;

            bool check = dfs((*iter)[1], visited, tickets, answer);

            if(check) {
                return true; 
            } else {
                visited[idx] = false; 
            }
        }
    }
    
    if(int(tickets.size()) == int(answer.size()) - 1) {
        return true; 
    }

    answer.pop_back();

    return false;
}

vector<string> solution(vector<vector<string>> tickets) {
    vector<string> answer;

    vector<int> visited(tickets.size());
	sort(tickets.begin(), tickets.end());

	dfs("ICN", visited, tickets, answer);

	return answer;
}