[C++] 프로그래머스/3/43164. 여행경로

2025. 7. 14. 11:51·C++/Coding Test

여행경로 (프로그래머스 Level 3 - 43164)

1. 문제 설명

주어진 항공권 정보 tickets를 바탕으로 "ICN"에서 출발하는 여행 경로를 찾되,
모든 항공권을 한 번씩 사용하면서 사전 순으로 가장 앞선 경로를 구해야 한다.

  • 항공권 정보는 [출발지, 도착지] 형식
  • 경로는 항공권을 모두 사용한 순서대로 나열한 공항명 벡터

2. 핵심 아이디어

  • 모든 항공권을 순회해야 하므로 DFS 백트래킹 사용
  • 사전순으로 가장 앞선 경로를 반환하기 위해 티켓 목록을 정렬
  • 경로가 완성되면 그 순간 바로 answer에 저장하고 리턴
  • 이미 경로를 찾았다면 더 이상 탐색하지 않도록 !answer.empty() 체크로 조기 탈출

3. 코드 설명

DFS

void dfs(vector<vector<string>>& tickets, int depth) {
    if (depth == tickets.size()) {
        answer = path;
        return;
    }

    for (int i = 0; i < tickets.size(); ++i) {
        if (!visited[i] && tickets[i][0] == path.back()) {
            visited[i] = 1;
            path.push_back(tickets[i][1]);
            dfs(tickets, depth + 1);
            if (!answer.empty()) return; // 사전순 최소 경로면 바로 리턴
            path.pop_back();
            visited[i] = 0;
        }
    }
}
  • depth == tickets.size()이면 모든 티켓 사용 완료 → path를 answer로 복사
  • 현재 위치가 path.back()인 티켓만 탐색
  • 재귀적으로 다음 도시로 이동
  • 경로를 찾은 경우 백트래킹을 멈춘다

전체 코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;
vector<string> answer,path;
vector<int> visited;

void dfs(vector<vector<string>>& tickets, int depth) {
    if (depth == tickets.size()) {
        answer = path;
        return;
    }

    for (int i = 0; i < tickets.size(); ++i) {
        if (!visited[i] && tickets[i][0] == path.back()) {
            visited[i] = 1;
            path.push_back(tickets[i][1]);
            dfs(tickets, depth + 1);
            if (!answer.empty()) {
                return;
            }
            path.pop_back();
            visited[i] = 0;
        }
    }
}

vector<string> solution(vector<vector<string>> tickets) {
    visited.resize(tickets.size(), 0);
    path = {"ICN"};

    sort(tickets.begin(), tickets.end());
    dfs(tickets, 0);

    return answer;
}

 

'C++ > Coding Test' 카테고리의 다른 글

[C++] 백준/Gold/4179. 불!  (0) 2025.04.24
[C++] 백준/Gold/15685. 드래곤 커브  (0) 2025.04.23
[C++] 백준/Gold/11066. 파일 합치기  (0) 2025.04.10
[C++] 백준/Gold/10986. 나머지 합  (0) 2025.04.09
[C++] 백준/Silver/1024. 수열의 합  (0) 2025.04.08
'C++/Coding Test' 카테고리의 다른 글
  • [C++] 백준/Gold/4179. 불!
  • [C++] 백준/Gold/15685. 드래곤 커브
  • [C++] 백준/Gold/11066. 파일 합치기
  • [C++] 백준/Gold/10986. 나머지 합
돼지표
돼지표
https://github.com/wkdgns135
  • 돼지표
    돼지표 개발 스토리
    돼지표
  • 전체
    오늘
    어제
    • 분류 전체보기 (112)
      • C++ (60)
        • Coding Test (53)
        • Study (1)
      • Python (1)
      • Machine Learning (2)
      • Computer Graphics (4)
        • Curly Hair Simulation (2)
      • GPU Programming (11)
        • CUDA basic (7)
        • CUDA fluidsGL (4)
      • Unreal 5 (26)
        • Troubleshooting (4)
        • FPS Shooting (5)
        • Study (10)
        • EOS (1)
        • STILL LOADING (5)
      • Computer Science (7)
        • Algorithm (3)
      • Other (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    BFS
    Fluid Simulation
    UE5
    OpenGL
    수학
    FPS
    그래프 탐색
    Algorithm
    구현
    Rendering Pipeline
    C++
    STILL LOADING
    CUDA
    자료 구조
    아이작 맵 생성
    dp
    정렬
    unreal 5
    CS
    GPU Programming
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
돼지표
[C++] 프로그래머스/3/43164. 여행경로
상단으로

티스토리툴바