[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค :: ์—ฌํ–‰๊ฒฝ๋กœ (DFS, ๋ฌธ์ œ ํ’€์ด, ์ฝ”๋“œ)

์—ฌํ–‰๊ฒฝ๋กœ

๋ฌธ์ œ

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

๋ฌธ์ œ ์„ค๋ช…

์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ์„ ๋ชจ๋‘ ์ด์šฉํ•˜์—ฌ ์—ฌํ–‰๊ฒฝ๋กœ๋ฅผ ์งœ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ICN ๊ณตํ•ญ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๊ณต๊ถŒ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด tickets๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฐฉ๋ฌธํ•˜๋Š” ๊ณตํ•ญ ๊ฒฝ๋กœ๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • ๋ชจ๋“  ๊ณตํ•ญ์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž 3๊ธ€์ž๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ๊ณตํ•ญ ์ˆ˜๋Š” 3๊ฐœ ์ด์ƒ 10,000๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • tickets์˜ ๊ฐ ํ–‰ [a, b]๋Š” a ๊ณตํ•ญ์—์„œ b ๊ณตํ•ญ์œผ๋กœ ๊ฐ€๋Š” ํ•ญ๊ณต๊ถŒ์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ์€ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์ผ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๊ฐ€ ์•ž์„œ๋Š” ๊ฒฝ๋กœ๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

tickets return
[[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]

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์˜ˆ์ œ #1

[ICN, JFK, HND, IAD] ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ #2

[ICN, SFO, ATL, ICN, ATL, SFO] ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ [ICN, ATL, ICN, SFO, ATL, SFO] ๊ฐ€ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์•ž์„ญ๋‹ˆ๋‹ค.


์ฝ”๋“œ

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

using namespace std;

vector<string> DFS(vector<string>& stk, string key, vector<vector<string>>& tickets){
    if(tickets.size()==0) // ticket์„ ๋ชจ๋‘ ์‚ดํŽด๋ดค์œผ๋ฉด
        return stk; // ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์žˆ๋‹ค.

    for(int i=0; i<tickets.size(); i++){ // ํ‹ฐ์ผ“์„ ๋ชจ๋‘ ์‚ดํŽด๋ณธ๋‹ค.
        vector<string> tmp = tickets[i];
        if(tmp[0]==key){ // key ๊ฐ’์— ๋”ฐ๋ฅธ value๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
            stk.push_back(tmp[1]);
            tickets.erase(tickets.begin()+i);
            vector<string> result = DFS(stk, tmp[1],tickets); // ์žฌ๊ท€
            if(result.size()!=0)
                return result;
            stk.pop_back();
            tickets.insert(tickets.begin()+i,tmp);
        }
    }
    vector<string> tmp;
    return tmp;
}

vector<string> solution(vector<vector<string>> tickets) {
    vector<string> answer;

    sort(tickets.begin(), tickets.end());
    answer.push_back("ICN");
    answer = DFS(answer,"ICN",tickets);

    return answer;
}

 

ํ’€์ด

์ด ๋ฌธ์ œ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ •ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋‹ค.

map์„ ์‚ฌ์šฉํ•˜์˜€์„ ๋•Œ๋Š” ๊ธฐ์กด์— ["ICN, "JFK"] ์ด๋˜ ํ˜•ํƒœ๋ฅผ {"ICN":["JFK"]}์™€ ๊ฐ™์ด ๋ฐ”๊พธ๊ฒŒ ๋œ๋‹ค. map์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ticket์„ ์ฒดํฌํ–ˆ๋Š”์ง€๋ฅผ ์•Œ๊ธฐ ์–ด๋ ต๋‹ค. ์™œ๋ƒ๋ฉด map ์ž๋ฃŒ๊ตฌ์กฐ ์ƒ key์— ๋”ฐ๋ฅธ value์˜ ๊ฐ’์ด ๋ชจ๋‘ ๋น„์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ key ๊ฐ’์— ๋”ฐ๋ฅธ value ๊ฐ’์„ ์ฐพ๊ธฐ๊ฐ€ ์‰ฌ์šด ์žฅ์ ์€ ์žˆ๋‹ค.

stack์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด์˜ ["ICN", "JFK"] ํ˜•ํƒœ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ticket์„ ์ฒดํฌํ–ˆ๋Š”์ง€ ์•Œ๊ธฐ ์‰ฝ๋‹ค. stack์˜ size๊ฐ€ 0์ธ์ง€๋งŒ ์•Œ๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น key ๊ฐ’์— ๋”ฐ๋ฅธ value๊ฐ€ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์กด์žฌํ•˜๋Š” ticket์„ ๋ชจ๋‘ ์‚ดํŽด๋ด์•ผํ•œ๋‹ค.

๋‚˜๋Š” DFS๋กœ stack์„ ์‚ฌ์šฉํ•ด์„œ ํ’€์—ˆ๋‹ค.

 

์ฑ„์  ๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•