프로그래머스/Lv.3

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

MINU.SHINNNN 2023. 2. 9. 00:50

https://school.programmers.co.kr/learn/courses/30/lessons/43164

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

모든 노드를 방문하는 경로 중 우선순위를 따지는 문제이다.

처음은 구조체를 사용해서 따로 우선순위 큐 기반의 연결 리스트 자료구조를 만들었고 스택으로 알고리즘을 구현했다. 문제는 알파벳 순 탐색을 할 때, 우선순위대로만 탐색하면 모든 공항을 돌 수 없는 경우가 있다는 것이다.

ex) 1-2/ 1-3/ 3-1 

예시의 경우 우선순위대로 1-2를 방문하지만 연결된 곳이 없어 종료하게 된다. 이러면 모든 공항을 방문해야 한다는 조건을 만족할 수 없다. 따라서 다음 우선순위인 1-3을 먼저 방문해야 한다. 이것을 체크 변수를 사용해서 체크하고, 만약 해당 경우라면 pop_back() 해주고 다음 우선순위를 push_back() 해준다.

이 부분을 놓쳤었고 문제 파악이 제대로 안된 부분이었다.

추가적으로, 따로 연결리스트를 만들 필요도 없이, 오름차순 정렬 하면 같은 출발 공항일 때 우선순위가 먼저인 도착 공항을 가지는 티켓이 앞에 오게 된다.   

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

vector<string> answer;
bool visited[100001];
bool check = false;


void dfs(string airport, vector<vector<string>> tickets,int count){
    if(count == tickets.size()){// 모두 사용
        check = true;
    } 
    answer.push_back(airport);

    for(int i=0; i<tickets.size(); i++){
        if(!visited[i] and tickets[i][0] == airport){//현재공항티켓 탐색
            visited[i] = true;
            dfs(tickets[i][1], tickets,count+1);

            if(!check){//모두 다 사용할수 없을경우
                answer.pop_back();
                visited[i] = false;
            }
        }
    }
}

vector<string> solution(vector<vector<string>> tickets) {
    
    sort(tickets.begin(), tickets.end());
    dfs("ICN", tickets,0);
    return answer;
}