Hello Ocean! ๐ŸŒผ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์—ฌํ–‰ ๊ฒฝ๋กœ, C++ ๋ณธ๋ฌธ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์—ฌํ–‰ ๊ฒฝ๋กœ, C++

bba_dda 2020. 9. 21. 20:41
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ ์„ค๋ช…

์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ์„ ๋ชจ๋‘ ์ด์šฉํ•˜์—ฌ ์—ฌํ–‰๊ฒฝ๋กœ๋ฅผ ์งœ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ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] ๊ฐ€ ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์•ž์„ญ๋‹ˆ๋‹ค.

 

ํ’€์ด 

  • dfs๋กœ ํ’€์ด 
  • ์‹œ์ž‘์ ์€ ํ•ญ์ƒ ICN
  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ๋‘๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๊ฐ€ ์•ž์„œ๋Š” ๊ฒฝ๋กœ๋ฅผ returnํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ •๋ ฌ ํ•„์š” 
#include <string> 
#include <vector> 
#include <algorithm> 

using namespace std; 
bool dfs(string start, vector<vector<string>>& tickets, vector<bool>& visit, vector<string>& route, vector<string>& answer, int count) { 
    route.push_back(start); //์‹œ์ž‘์  push
    if (count == tickets.size()) { //์ฃผ์–ด์ง„ ํ‹ฐ์ผ“์„ ๋‹ค ์“ฐ๋ฉด return
        answer = route; 
        return true; 
    } 
    for (int i=0 ; i<tickets.size() ; i++) { //ํ‹ฐ์ผ“ ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต
        if (tickets[i][0] == start && visit[i] == false) { //start์—์„œ ์‹œ์ž‘ํ•˜๋Š” ํ‹ฐ์ผ“์ด๊ณ , ํ•ด๋‹น ํ‹ฐ์ผ“์„ ์“ด ์ ์ด ์—†์œผ๋ฉด
            visit[i] = true; //ํ•ด๋‹น ํ‹ฐ์ผ“ ์‚ฌ์šฉ
            //ํ•ด๋‹น ํ‹ฐ์ผ“์˜ ๋„์ฐฉ์ง€๋ฅผ ์‹œ์ž‘์ ์œผ๋กœํ•ด์„œ ๋‹ค์‹œ dfs
            bool success = dfs(tickets[i][1], tickets, visit, route, answer, count+1); 
            if (success) //ํ•ด๋‹น ํ‹ฐ์ผ“์˜ ๋„์ฐฉ์ง€๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ํ•ด์„œ dfsํ•ด์„œ ํƒ์ƒ‰์— ์„ฑ๊ณตํ•˜๋ฉด 
                return true; //์ข…๋ฃŒ 
            visit[i] = false; //์•„๋‹ˆ๋ฉด, ํ•ด๋‹น ํ‹ฐ์ผ“์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ (ํƒ์ƒ‰์— ์‹คํŒจํ–ˆ์œผ๋ฏ€๋กœ)
        } 
    } 
    route.pop_back(); //start๋ฅผ ์‹œ์ž‘์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ–ˆ์œผ๋ฏ€๋กœ, start๋ฅผ route์—์„œ ์ œ๊ฑฐ 
    return false; 
} 
vector<string> solution(vector<vector<string>> tickets) { 
    vector<string> answer, route; 
    vector<bool> visit(tickets.size(), false); //ํ‹ฐ์ผ“์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด 
    sort(tickets.begin(), tickets.end()); //์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌ (๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ ๋Œ€๋น„)
    dfs("ICN", tickets, visit, route, answer, 0); //์‹œ์ž‘์ ์€ ํ•ญ์ƒ ์ธ์ฒœ๊ณตํ•ญ 
    return answer; 
}

๋ฐ˜์‘ํ˜•