본문 바로가기

■ 알고리즘 문제 풀이/프로그래머스

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

▶문제설명

코딩테스트 연습 > 깊이/너비 우선 탐색 > 여행경로

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

▶ 설계


재귀 함수를 잘 구현하면 해결할 수 있을 것 같다.

재귀 함수의 종료 조건은 모든 티켓을 다 사용했을 경우이다.

전역변수 N에 티켓의 개수를 저장하자.


1
2
3
4
5
6
7
8
bool findPath(vector<string>& answer, vector<vector<string>> tickets, string city, int cnt) {
    if(N==cnt) 
        return true;
        
 
    return false;

}
cs


문제에서 경로가 여러개인 경우 사전순으로 빠른 경로를 출력하라고 했으므로 sort(tickets.begin(), tickets.end())를 호출해서 정렬해주면 문제 해결이 더 쉬울 것으로 보인다.

사용된 티켓을 또 사용할 수 없으므로 bool usedTickets[10000]을 선언해서 체크하자.

티켓을 순차적으로 보면서 가능한 모든 경우를 일일이 확인해보자.



▶ 구현


문제에서 "ICN"에서부터 출발한다고 했으므로 findPath()를 호출하기 전에 answer.push_back("ICN")를 호출해주었다.


이미 티켓이 사전순으로 정렬되어 있으므로 tickets를 처음부터 훑으면서 출발지가 city와 일치하는 경우를 찾아가며 answer.push_back("도착지")해 나가다가 N==cnt가 되었을 때 종료하도록 구현했다.


재귀함수가 bool타입을 반환하도록 하여 정답을 찾고 나면 true를 리턴하고 더이상 진행되지 않도록 했다.

그리고 모든 경우를 해보아야 하므로(브루트 포스) 다음 티켓을 찾기 전에 answer.pop()해서 원래의 상태로 되돌려주었다.



▶Solution