๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์—ฌํ–‰๊ฒฝ๋กœ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 2. 10.

<๋ฌธ์ œ ๋งํฌ>

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

 

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

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

programmers.co.kr

 

<ํ’€์ด ์ „๋žต>

1. ๋‚˜๋Š” ๋ณ„ ์ƒ๊ฐ์—†์ด ๋ฐฑํŠธ๋ž˜ํ‚น์œผ๋กœ ํ’€์–ด์„œ ํ†ต๊ณผํ–ˆ๋Š”๋ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค ํ’€์ด ๋ณด๋‹ˆ๊นŒ ์—ญ์ˆœ์œผ๋กœ dfs ํ•œ ๋ฒˆ๋งŒ์— ํ‘ธ๋Š” ํ’€์ด๊ฐ€ ์žˆ์–ด์„œ ๋‘˜ ๋‹ค๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.

2. ๋ฐฑํŠธ๋ž˜ํ‚น์€ ๊ทธ๋ƒฅ ๋ฐ˜ํ™˜ ์กฐ๊ฑด์„ ์ž˜ ์„ค์ •ํ•ด์„œ ๋ฐฑํŠธ๋ž˜ํ‚น ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋ ต์ง€ ์•Š๋‹ค.

3. DFS ํ’€์ด๋Š” ์กฐ๊ธˆ ํŠน์ดํ•œ๋ฐ ์ถœ๋ฐœ์ง€๊ฐ€ 'ICN'์œผ๋กœ ๊ณ ์ •๋˜์–ด์žˆ๊ณ  ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ๋„์‹œ๋ฅผ ์—ฌํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค๋Š” ์ ์„ ์ด์šฉํ•ด์„œ ์ถœ๋ฐœ์ง€๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ๊ฒฝ๋กœ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

4. ๋‘˜ ๋‹ค ํ†ต๊ณผ๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ DFS ํ’€์ด๊ฐ€ ์กฐ๊ธˆ ๋” ๋ฐœ์ƒ์ด ํ•„์š”ํ•œ ๋Œ€์‹  ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋‹ค.  

 

<์ •๋‹ต ์ฝ”๋“œ>

# 230122 ์—ฌํ–‰๊ฒฝ๋กœ(๋ฐฑํŠธ๋ž˜ํ‚น)


def solution(tickets):

    # ๋ณ€์ˆ˜ ์„ค์ • ๋ฐ ์ดˆ๊ธฐํ™”
    answer = []
    N = len(tickets)
    visited = [0 for _ in range(N)]


    # ๋ฐฑํŠธ๋ž˜ํ‚น ํ•จ์ˆ˜ ์„ ์–ธ
    def backtracking(depth: int, current: str, route:list):
        nonlocal N, answer


        # ๋ฐ˜ํ™˜ ์กฐ๊ฑด
        if depth == N:
            if not answer or answer >= route:
                answer = route
            return

        # ๋ฐฑํŠธ๋ž˜ํ‚น
        for i in range(N):

            if not visited[i] and tickets[i][0] == current:
                visited[i] = 1
                backtracking(depth + 1, tickets[i][1], route + [tickets[i][1]])
                visited[i] = 0

    backtracking(0, 'ICN', ['ICN'])


    return answer

 

# 230122 ์—ฌํ–‰๊ฒฝ๋กœ (DFS)


from collections import defaultdict


def solution(tickets):
    
    answer = []
    ticket_dict = defaultdict(list)

    for ticket in tickets:
        ticket_dict[ticket[0]].append(ticket[1])
    
    
    for v in ticket_dict.values():
        v.sort(reverse=True)
    

    stack = ['ICN']

    while stack:

        top = stack[-1]

        if not ticket_dict[top]:
            answer.append(stack.pop())
        else:
            stack.append(ticket_dict[top].pop())

    answer.reverse()

    return answer

๋Œ“๊ธ€