코딩테스트 연습
- 여행경로
문제를 보면 주어진 항공권을 모두 이용하여
라고 언급되어 있었다.
즉, 모든 경로를 한번씩 방문해줘야 하는데 처음에 도전할 때는 제대로 보지도 않고 그냥 모든 공항을 방문하는 식으로 코드를 작성했다.
DFS를 사용했고, vector을 stack 대신에 사용했다.
그러기 위해서는 vector에 공항 이름을 넣을 때, 알파벳 순서 중에서 후순위에 있는 것들을 먼저 넣어야 해서 sort로 먼저 정렬을 진행했다.
sort(tickets.begin(), tickets.end(), greater< vector<string> >());
처음에는 위 코드가 어떻게 정렬해주는지 어려웠다. 그래서 직접 코드를 작성해서 출력해봤더니,
[[ICN, SFO], [ICN, ATL], [SFO, ATL], [ATL, ICN], [ATL, SFO]]
가
[[SFO, ATL], [ICN, SFO], [ICN, ATL], [ATL, SFO], [ATL, ICN]]
로 정렬되는 걸 볼 수 있었다.
greater<자료형>()으로 인해 vector들이 내림차순이 되는데 만약 [0]이 같은 string이라면 [1]에 있는 값들을 내림차순으로 정렬해준다.
그리고 dfs 방법으로 공항을 하나씩 방문했다.
sort(arr, arr+n);
sort(v.begin(), v.end());
sort(v.begin(), v.end(), compare);
sort(v.begin(), v.end(), greater<자료형>());
sort(v.begin(), v.end(), less<자료형>());
#include <string>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
vector<string> solution(vector<vector<string>> tickets) {
vector<string> answer;
unordered_map<string, vector<string> > m;
sort(tickets.begin(), tickets.end(), greater< vector<string> >());
for(int i = 0 ; i < tickets.size() ; i++){
m[tickets[i][0]].push_back(tickets[i][1]);
}
vector<string> s = vector<string> {"ICN"}; // 벡터가 stack의 역할을 해준다.
while(!s.empty()){
string airport = s.back();
if(m.find(airport) == m.end() || m[airport].size() == 0){
// 갈수 있는 곳이 없거나 다 방문했다면
answer.push_back(airport);
s.pop_back();
}else{
s.push_back(m[airport].back());
m[airport].pop_back();
}
}
reverse(answer.begin(), answer.end());
return answer;
}