Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Programmers

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] (Swift) ์—ฌํ–‰๊ฒฝ๋กœ (lv.3) (DFS, Well-Known ๊ธฐ์–ตํ•ด์ฃผ์„ธ์šค)

๊ฐ์ž ๐Ÿฅ” 2023. 2. 24. 18:35
๋ฐ˜์‘ํ˜•

์•„์•„์•„ ์งœ์ฆ๋‚˜ ์ž˜ ์•ˆํ’€๋ คใ… ใ…  ์˜ˆ์ „์— ๋‚ด๊ฐ€ ํ’€์—ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์ž ๊น ์ฐธ๊ณ ํ•˜๊ณ  ํ’€์—ˆ์”€... ํก.. ๐Ÿคฅ

 

โšซ๏ธ ๋ฌธ์ œ

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

โšซ๏ธ ๋‚˜์˜ ํ’€์ด

์ผ๋‹จ ๋ณด์ž๋งˆ์ž DFS์ž„์„ ํŒŒ์•…ํ•˜๊ธด ํ–ˆ๋Š”๋ฐ... ์ž˜ ์•ˆํ’€๋ ธ๋‹ค. ์‹œ์ž‘์ง€์ ์ด ICN์œผ๋กœ ์ง€์ •๋˜์–ด์žˆ์—ˆ๋Š”๋ฐ, dfs์— ICN์„ ์ „๋‹ฌํ•˜๋ฉด, ํ‹ฐ์ผ“์˜ ์ฒซ๋ฒˆ์จฐ์›์†Œ๊ฐ€ ICN์ธ๊ฑธ ์ฐพ์•„์•ผํ•˜๋Š”๊ฑด๊ฐ€? ์‹ถ์–ด์„œ ๊ณ ๋ฏผํ–ˆ๊ณ , ๊ทธ ์ดํ›„์— ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ํŒ๋‹จํ•˜๊ณ  answer์— ์Œ“์•„์•ผํ•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ํ•˜์ง€.. ๊ทธ๋ƒฅ ๊ณ ๋ฏผ์ด์—ˆ๋‹ค. 

๊ฒฐ๊ตญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋– ์˜ฌ๋ฆฌ๋Š”๊ฑด ๊ฐ€๋Šฅํ–‡์ง€๋งŒ, ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ๋ถ€์กฑํ–ˆ๋‹ค. 5๊ฐœ์›”์ „์— ํ’€์–ด๋ณธ ๋ฌธ์ œ์˜€์ง€๋งŒ,, ์ƒ๊ฐ์ด ๋‚˜์ง€ ์•Š์•˜๋‹ค ใ… ใ…  
์ด ๋ฌธ์ œ๋Š” dfs์— start ์ง€์ ์„ ๋˜์ ธ์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ๋œ๋‹ค. 

์ฒ˜์Œ์— ICN์„ ๋˜์ ธ์คฌ์œผ๋‹ˆ, for ๋ฌธ์„ ๋Œ๋ ค์„œ ticket๋‚ด๋ถ€์—์„œ start์ง€์ ์ด ICN์ด๋ž‘ ๋™์ผํ•œ ํ‹ฐ์ผ“์„ ์ฐพ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ‹ฐ์ผ“์ด ๋งŒ์•ฝ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ํ‹ฐ์ผ“์ด๋ผ๋ฉด, ๊ทธ ํ‹ฐ์ผ“๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. 

ํ‹ฐ์ผ“์„ ์‚ฌ์šฉํ•˜๊ณ , ํ‹ฐ์ผ“์— ์žˆ๋Š” end ๊ณตํ•ญ์ด, ๋‹ค์Œ ๋‚ด๊ฐ€ ๋ฐฉ๋ฌธํ•  start ๊ณตํ•ญ์ด ๋˜๊ฒŸ์ง€? ๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ DFS์— end๋ฅผ ์ „๋‹ฌํ•ด์„œ ๋‹ค์‹œ ์žฌ๊ท€๋ฅผ ๋Œ๋ ค์ฃผ๋ฉด ๋œ๋‹ค. ์ด ๋‹ค์Œ์ด ์ข€ ๊นŒ๋‹ค๋กœ์› ๋˜ ๋ถ€๋ถ„์ธ๋ฐ, ์žฌ๊ท€์˜ ๊ตฌ์กฐ๋ฅผ ์ž˜ ์ƒ๊ฐํ•ด์•ผํ–ˆ๋‹ค. ์žฌ๊ท€๋ฅผ ํƒ€๊ณ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€์„œ, ์ฐจ๋ก€๋Œ€๋กœ return ํ•ด๋‚˜์˜จ๋‹ค. ํŠน์ • ์กฐ๊ฑด, ์ฆ‰ ์—ฌ๊ธฐ์„œ๋Š” ๋ชจ๋“  ํ‹ฐ์ผ“์„ ๋‹ค ์‚ฌ์šฉํ–ˆ์œผ๋ฉด ๋งจ ํ•˜์œ„์—์žˆ๋Š” dfs ํ•จ์ˆ˜๊ฐ€ return ๋  ๊ฒƒ์ด๊ณ , ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜ค๊ฒŒ ๋˜๋ฉด ๋‹ค์‹œ ๊ทธ ์œ—๋‹จ๊ณ„ dfsํ•จ์ˆ˜๋ถ€๋ถ„์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ๋œ๋‹ค. ๊ทธ๋•Œ, visited๋Š” false์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด์„œ ๋„˜์–ด๊ฐ€์•ผํ•˜๊ณ  answer๋กœ ์Œ“์•„๋†ง๋˜ ๊ฐ’๋“ค๋„ ํ•˜๋‚˜์”ฉ ์ง€์›Œ๊ฐ€๋ฉด์„œ ์•ž์˜ dfs ํ•จ์ˆ˜๋กœ ๋„˜์–ด๊ฐ€์ฃผ์–ด์•ผํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๋‹ค์Œ for๋ฌธ์„ ๋Œ๋•Œ ์ •์ƒ์ ์ธ ์ƒํƒœ๋กœ ๋Œ์ˆ˜์žˆ์œผ๋‹ˆ๊นŒ!

โšซ๏ธ ์ •๋‹ต ์ฝ”๋“œ

import Foundation

let tickets = [["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]]
// return : ["ICN", "JFK", "HND", "IAD"]

func solution(_ tickets:[[String]]) -> [String] {
    var answer = [String]()
    var visited = Array(repeating: false, count: tickets.count)
    let tickets = tickets.sorted{ $0[1] < $1[1] }

    // MARK: - DFS ํ•จ์ˆ˜
    func dfs(airport: String) {
        // ๋งŒ์•ฝ ๋ชจ๋“  ํ‹ฐ์ผ“์ด ๋‹ค ์‚ฌ์šฉ๋˜๊ณ  ๋งˆ์ง€๋ง‰ end ์ง€์ ์ด๋ผ๋ฉด?
        if tickets.count == answer.count {
            answer.append(airport)
            return
        }

        for i in 0..<tickets.count {
            let start = tickets[i][0]
            let end = tickets[i][1]

            if airport == start, !visited[i] {
                visited[i] = true
                answer.append(start)
                dfs(airport: end)
                if tickets.count + 1 == answer.count {
                    return
                }
                visited[i] = false
                answer.removeLast()
            }
        }
    }

    dfs(airport: "ICN")

    return answer
}

print(solution(tickets))

 

์ด ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์ž˜ ๊ธฐ์–ตํ•ด๋‘์ž. DFS ์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์ด๊ธฐ๋„ ํ•˜๋‹ค. return ํ•ด๋‚˜์˜ค๋ฉด์„œ false์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ , answer์— ์žˆ๋Š” ๊ฒƒ๋“ค์„ ํ•˜๋‚˜์”ฉ ์—†์• ์ฃผ๋Š” ๊ณผ์ •๋„ ๊ผญ ์žŠ์ง€๋ง๊ณ  ๊ตฌํ˜„ํ•ด์ฃผ์ž. ์•„์ง ์žฌ๊ท€์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋–จ์–ด์ง€๋Š” ๋‚˜๋Š”, ์ด๋ถ€๋ถ„์„ ์ƒ๊ฐํ•ด๋‚ด๋Š”๊ฒŒ ๊ฐ€์žฅ ์–ด๋ ค์› ๋‹ค. 

LV3๋ผ์„œ ์—„์ฒญ๋‚œ ์Šคํ‚ฌ์„ ์š”๊ตฌํ• ๊ฒƒ ๊ฐ™์€ ๋ฌธ์ œ์˜€์ง€๋งŒ, ์‚ฌ์‹ค ๊ทธ๋ƒฅ ๊ธฐ๋ณธ์ค‘์˜ ๊ธฐ๋ณธ๋ฌธ์ œ์˜€๋‹ค. ๊ผญ ๋‹ค์‹œํ’€์–ด๋ณด๊ณ , ๊ธฐ์–ตํ•ด์ฃผ์ž ใ… ใ… ใ…  ํ™”์ดํŒ….

๋ฐ˜์‘ํ˜•