ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 여행경로
    문제 풀이 2020. 5. 15. 17:06
    문제 설명

    주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 ICN 공항에서 출발합니다.

    항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

    제한사항
    • 모든 공항은 알파벳 대문자 3글자로 이루어집니다.
    • 주어진 공항 수는 3개 이상 10,000개 이하입니다.
    • tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.
    • 주어진 항공권은 모두 사용해야 합니다.
    • 만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.
    • 모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.
    입출력 예
    ticketsreturn
    [[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

    댓글

Designed by Tistory.