
#include <string>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
// 알파벳 순서 우선임을 찾기위한 함수
bool mySort(string& a, string& b){
if(a[0] == b[0] && a[1]==b[1]) return a[2]<b[2];
if(a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
// 중복을 막기위한 ch배열
bool ch[10001];
vector<string> answer;
void DFS(vector<vector<string>> ticket, string curr, vector<string> ret){
// 경로가 완성이 되면 알파벳순으로 크기비교 하도록 한다.
if(ret.size() == ticket.size()+1){
if(answer.empty()) answer = ret;
else{
for(int i=0; i<ret.size(); i++){
if(answer[i] != ret[i]){
if(mySort(answer[i], ret[i])) break;
else answer = ret;
}
}
}
return;
}
// 갈수 있는 다음 도착지로 간다.
for(int i=0; i<ticket.size(); i++){
if(!ch[i] && ticket[i][0] == curr){
ch[i] = true;
ret.push_back(ticket[i][1]);
DFS(ticket, ticket[i][1], ret);
ret.pop_back();
ch[i] = false;
}
}
}
vector<string> solution(vector<vector<string>> tickets) {
vector<string> tmp;
tmp.push_back("ICN");
DFS(tickets, "ICN", tmp);
return answer;
}
// 나는 벡터를 파라미터로 주었찌만 이분은 string을 파라미터로 주어서 마지막에 짤랐다.
// 이 아이디어도 매우 중요한것 같다.
#include <string>
#include <vector>
using namespace std;
int visited[1000000];
string ans_string = "a";
void dfs(vector<vector<string>> &tickets, string cur, string path, int depth) {
if (depth == tickets.size()) {
string p = path;
// string으로 만들면 굳이 배열을 만들지 않더라도 이렇게 한번에 비교가 가능하다.
if (path < ans_string) {
ans_string = path;
}
return;
}
// 나랑 아이디어는 같지만 string에 더해주는 더 편한 방법을 사용하였다.
for (int i = 0; i < tickets.size(); i++) {
if (cur == tickets[i][0] && !visited[i]) {
visited[i] = 1;
dfs(tickets, tickets[i][1], path + tickets[i][1], depth+1);
visited[i] = 0;
}
}
}
vector<string> solution(vector<vector<string>> tickets) {
vector<string> answer;
dfs(tickets, "ICN", "ICN", 0);
// 티켓은 다 3개씩 짤리므로 이렇게 substr을 사용하여 문자열을 짤라주었다.
for (int i = 0; i < ans_string.size(); i+=3) {
answer.push_back(ans_string.substr(i, 3));
}
return answer;
}
내 풀이랑 다른분이 푸신거랑 아이디어는 비슷하지만 저렇게 string으로만 푸는것이 훨씬 효율적이였다. 이런 아이디어도 꼭 생각할 수 있어야한다. 부스트캠프 준비를 위한 중요문제라고 생각하자.