DFS ์ˆœ์—ด

BackEnd_Ash.logยท2021๋…„ 4์›” 8์ผ
0

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ

๋ชฉ๋ก ๋ณด๊ธฐ
6/7

๐Ÿ“Œ๐Ÿ‘‰

๐Ÿ“Œ ์ˆœ์—ด

์„œ๋กœ ๋‹ค๋ฅธ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆœ์—ด์„ ๋ฆฌํ„ดํ•˜๋ผ

๐Ÿ‘‰ ํ’€์ด๋กœ์ง

'''
์ˆœ์—ด
์„œ๋กœ ๋‹ค๋ฅธ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆœ์—ด์„ ๋ฆฌํ„ดํ•˜๋ผ

Example 1:
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Example 2:
Input: nums = [0,1]
Output: [[0,1],[1,0]]

Example 3:
Input: nums = [1]
Output: [[1]]
'''
from typing import List


def permute(nums: List[int]) -> List[List[int]]:
    results = []
    prev_elements = []

    def dfs(elements):
        # ๋ฆฌํ”„ ๋…ธ๋“œ์ผ๋•Œ ๊ฒฐ๊ณผ ์ถ”๊ฐ€
        if len(elements) == 0:
            results.append(prev_elements[:])

        # ์ˆœ์—ด ์ƒ์„ฑ ์žฌ๊ท€ ํ˜ธ์ถœ
        for e in elements:
            next_elements = elements[:]
            next_elements.remove(e)

            prev_elements.append(e)
            dfs(next_elements)
            prev_elements.pop()

    dfs(nums)
    return results


print(permute([1, 2, 3]))

๋‹ค์‹œ ์ด์ œ dfs(next_elements) ๋กœ ๋ฐ”๋กœ ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

elements ์—๋Š” ์™œ ๊ฐ‘์ž๊ธฐ 2๊ฐ€ ์ƒ๊ฒผ์„๊นŒ์š” ?

if len(elements) == 0 :
	results.append(prev_elements[:])

๋กœ ๋˜์–ด์žˆ๋Š” ๋ถ€๋ถ„์—์„œ results ์— ๋”ํ•˜๊ฒŒ ๋˜๊ณ  ,

๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€๊ฐ€ ๋œ ๋’ค elements ์— ์žˆ๋Š” ์š”์†Œ๊ฐ€ ์—†์œผ๋‹ˆ๊น .

๋‹ค์‹œ ๋˜ ๋Œ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๋˜๋Œ์•„ ๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

prev_elements.pop() ์„ ํ•ด์„œ ์š”์†Œ ํ•˜๋‚˜์”ฉ ๋บ€๋‹ค .

๋ฐ˜๋ณต๋ฌธ์ด 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š”๊ฒƒ์ด ๋ชจ๋‘ ๋๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ

2 ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.

results ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ  , for e in elements: ๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฐ”๋กœ dfs(next_elements) ๋กœ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๋œ๋‹ค.

prev_elements.pop() ์„ ํ•˜๊ฒŒ๋˜๋ฉด , 3 ์ด ๋น ์ง€๊ฒŒ ๋˜๋ฉด์„œ ๋‹ค์‹œ

for e in elements

๋กœ ๊ฐ€๊ฒŒ ๋œ๋‹ค.

for e in elements 

์—์„œ ๋‹ค์‹œ ๋ฐ”๋กœ dfs(next_elements) ๋กœ ๊ฐ€๊ฒŒ ๋˜๊ณ 

๋‚ด๋ ค๊ฐ€์„œ prev_elements.pop() ์ด ์‹คํ–‰์ด ๋˜๋ฉด์„œ

prev_elements ์— ์žˆ๋Š” 1 ์ด ์‚ฌ๋ผ์ง€๋ฉด์„œ , ๋‹ค์‹œ

for e in elements ๋กœ ๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ด์ œ ๋‹ค์‹œ ๋ฐ”๋กœ dfs(next_elements) ๋กœ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋˜๋‹ค์‹œ elements ์— ์ด ์ƒ๊ฒจ๋‚œ ์ด์œ ๋Š” ??

๋ชจ๋“  ์š”์†Œ๋ฅผ ํƒ์ƒ‰ํ•œํ›„ ๋’ค๋กœ ๋˜๋Œ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ด์ œ ๋‹ค์‹œ ๋ฐ”๋กœ dfs(next_elements) ๋กœ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ด์ œ result ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ด์ œ ๋‹ค์‹œ ์ด์ „์ƒํƒœ๋กœ ๊ณ„์† ๋Œ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

prev_elements.pop() ์œผ๋กœ 1 ์„ ์ œ๊ฑฐ ํ•˜๊ณ  ๋‹ค์‹œ for e in elements ๋กœ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋‹ค์‹œ ์ด์ œ ์ „์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

prev_elements.pop() ์œผ๋กœ ์ธํ•ด์„œ 2 ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

์ด์ œ ์ „์ „์ „ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋˜๊ณ  ,

๋‹ค์‹œ prev_elements.pop() ์œผ๋กœ ์ธํ•ด์„œ 3์ด ์‚ฌ๋ผ์ง„๋‹ค.

๋.

profile
๊พธ์ค€ํ•จ์ด๋ž€ ... ?

0๊ฐœ์˜ ๋Œ“๊ธ€