๐Ÿ“š Study/Baekjoon

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv3 | dfs/bfs | ์—ฌํ–‰๊ฒฝ๋กœ

์œฐ๊ฐฑ 2025. 10. 9. 20:45

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

 

2026.04.02 ์„ธ์ƒ ๋ณต์žกํ•˜๊ฒŒ ํ’€์—ˆ๋„ค ๊ธฐ์ ˆ

dfs๋กœ ์ฒ˜์Œ์— ์ ‘๊ทผํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์™€์•ผ ํ•˜๋„ค ํ•˜๊ณ  bfs๋กœ ๋ฐ”๊ฟจ์—ˆ๋Š”๋ฐ

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋ฐฑํŠธ๋ ˆํ‚น์„ ํ•˜๋ฉด ๋œ๋‹ค๋Š”๊ฑฐ!

from collections import deque

def next_where(curr, tickets):
    routes = []
    for idx, (s,e) in enumerate(tickets):
        if s == curr:
            routes.append((idx,e))
    return routes

def bfs(start, tickets, n):
    queue = deque([(start, [start], [])])
    answer_list = []
    while queue:
        curr, answer, visited = queue.popleft()
        if len(answer) == n + 1: # ์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ ๋ชจ๋‘ ์‚ฌ์šฉํ•จ
            answer_list.append(answer)
            
        next_routes = next_where(curr, tickets)
        for n_idx, n_r in next_routes: # ํ˜„ ์œ„์น˜์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ
            if (n_idx, curr, n_r) not in visited: # ๋ฐฉ๋ฌธํ•œ ์  ์—†๋Š” ๋ฃจํŠธ์ผ ๋•Œ 
                answer_n = answer + [n_r]
                visited_n = visited + [(n_idx, curr, n_r)]
                queue.append((n_r, answer_n, visited_n))
    return answer_list


def solution(tickets):
    # ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ ๋‹ด๊ธฐ
    # ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋‹ค๋ฉด ์•ŒํŒŒ๋ฒณ์ด ๋จผ์ €์ธ ๊ฒฝ๋กœ๋ฅผ ๋‹ด๊ธฐ <-- X
    # dfs๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌ์ถ•
        # ํ˜„์žฌ ์œ„์น˜์—์„œ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‹ค์Œ ์žฅ์†Œ๋“ค ๋ฐฐ์—ด์„ ๋ฐ›์Œ
        # ๊ทธ ๋ฐฐ์—ด์„ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์—ดํ•˜๊ณ  <-- X
        # ๊ฐ๊ฐ์˜ ๊ฒฝ๋กœ bfs๋กœ ์ ‘๊ทผ    
    
    answer_list = bfs("ICN", tickets, len(tickets))
    answer_list.sort()
    return answer_list[0]

 


 

๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์–ด๋ ต๋‹ค ,, ใ… ใ…  

import sys
sys.setrecursionlimit(10**4)

def dfs(curr, tickets, visited, path, answer):
    if len(path) == len(tickets) + 1:
        answer.append(path[:])
        return
            
    for i in range(len(tickets)):
        if not visited[i] and tickets[i][0] == curr:
            next = tickets[i][1]
            visited[i] = True
            dfs(next, tickets, visited, path + [next], answer)
            visited[i] = False

def solution(tickets):
    answer = []
    visited = [False] * len(tickets)
    
    dfs("ICN", tickets, visited, ["ICN"], answer)
    
    answer.sort()
    return answer[0]

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