-
[프로그래머스] 여행경로문제 풀이 2020. 5. 15. 17:06
문제 설명
주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상
ICN
공항에서 출발합니다.항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- 모든 공항은 알파벳 대문자 3글자로 이루어집니다.
- 주어진 공항 수는 3개 이상 10,000개 이하입니다.
- tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.
- 주어진 항공권은 모두 사용해야 합니다.
- 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
- 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.
입출력 예
tickets return [[ ICN
,JFK
], [HND
,IAD
], [JFK
,HND
]][ ICN
,JFK
,HND
,IAD
][[ ICN
,SFO
], [ICN
,ATL
], [SFO
,ATL
], [ATL
,ICN
], [ATL
,SFO
]][ ICN
,ATL
,ICN
,SFO
,ATL
,SFO
]풀이)
dfs를 이용하였고
나같은 경우는, tickets들을 sort함수를 이용해서 오름차순 알파벳으로 나열한 뒤 경로를 골랐다.
코드)
#include <string> #include <vector> #include <algorithm> #include <iostream> using namespace std; vector<string> temp; vector<string> answer; vector<bool>visited; bool suc = false;
void dfs( string start, vector<vector<string>> tickets,int num){ temp.push_back(start); if(suc) return; if(num >= tickets.size() ){ //cout <<"suc\n" << endl; answer = temp; suc = true; //이미 알파벳 순으로 나열하고 경로를 찾은 거니깐, 다른 경로 찾지말고 바로 종료하게끔 return; } for(int i=0;i<tickets.size();i++){ if(visited[i])continue; if(tickets[i][0] == start){ visited[i] = true; //cout << tickets[i][1] <<" " ; dfs(tickets[i][1],tickets,num+1); visited[i] = false; } if(suc) return; } temp.pop_back(); } vector<string> solution(vector<vector<string>> tickets) { visited.resize(tickets.size()); fill(visited.begin(),visited.end(),false); sort(tickets.begin(),tickets.end());//오름차순 dfs("ICN",tickets,0); return answer; }
+ vector <bool> visited : 티켓 사용 여부 표시하는 것이므로 중요하다.
sort함수 사용하지 않으려면
임의의 string path변수(초기값 path ="ICN")를 만들어 놓고,
"path += 목적지string" 를 계속 하면서 경로를 늘려주고(dfs(tickets[i][1],tickets,path+tickets[i][1],num+1);)
마지막에 path와 이전에 구했던 past_path를 비교해서 작은 것을 past_path로 바꾸면 된다.
-> 알파벳이 작은게 앞으로 오게
string past_path= "a"; void dfs(string start, vector<vector<string>> tickets, string path, int num) {
if (num == tickets.size()) { if (path < past_path) { past_path = path; } return; }
...//아래는 생략
}
-> 최종 answer를 반환할때는 past_path 를 3개의 문자씩 잘라서 answer에 push_back()해주면된다.
'문제 풀이' 카테고리의 다른 글
[프로그래머스] 소수찾기 (0) 2020.05.16 [프로그래머스] 가장 큰수 (0) 2020.05.16 [SWEA] 5656 벽돌깨기 (0) 2020.05.14 [SWEA] 4012 요리사 (0) 2020.05.13 [SWEA] 5650 핀볼게임 (0) 2020.05.12