๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/DFS BFS

[Python] ๋ฐฑ์ค€ 15650 N๊ณผ M 2

by JayAlex07 2023. 4. 2.

๐Ÿง‘‍๐Ÿ’ป [Python] ๋ฐฑ์ค€ 15650 N๊ณผ M 2

Silver 3 - Backtracking

img

์‰ฝ๊ฒŒ itertools์˜ combinations๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋‹ค

ํ•˜์ง€๋งŒ Backtracking์„ ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์–ด์„œ ํ’€์—ˆ๋˜ ๋ฌธ์ œ๋‹ค

  • ๊ธฐ๋ณธ์ ์œผ๋กœ if len(nums) == M: ์„ ํ†ตํ•ด์„œ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ base case๋ฅผ ๋งŒ๋“ ๋‹ค
    • ์•ˆ ๋งŒ๋“ค๋ฉด ๋ฌดํ•œ ๋ฃจํ”„
  • ๋ฆฌ์ŠคํŠธ ์•ˆ์— for๋ฌธ์„ ๋Œ๋ฉฐ, ๋‚˜์˜ค๋Š” ์ˆซ์ž๊ฐ€ ์—†์„ ๋•Œ, ๋ฆฌ์ŠคํŠธ ์•ˆ์— ํ•ด๋‹น ์ˆซ์ž๋ฅผ ๋„ฃ๊ณ  backtracking(start)๋ฅผ ๋‹ค์‹œ ๋ˆ๋‹ค
    • ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€, ์ˆ˜์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค
    • ๊ทธ๋ž˜์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฆด๋•Œ๋งˆ๋‹ค backtracking(start + 1)๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค
    • ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด, for๋ฌธ์—์„œ ์ „์—์„œ backtracking() ํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค, ํฐ ์ˆ˜๋ถ€ํ„ฐ for๋ฌธ์„ ์ˆœํšŒํ•œ๋‹ค
  • ๊ทธ๋ฆฌ๊ณ  l.pop()์„ ํ•ด์•ผ, ๋ฆฌ์ŠคํŠธ์— ์ˆซ์ž๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ , ๋‹ค๋ฅธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค

 

์ฝ”๋“œ

 

๋ฐฑํŠธ๋ž˜ํ‚น ์‚ฌ์šฉ

N, M = map(int, input().split())

nums = []

def backtracking(start):

    if len(nums) == M:
        print(' '.join(map(str, nums)))
        return

    for num in range(start, N + 1):
        if num not in nums:
            nums.append(num)
            backtracking(num + 1)
            nums.pop()

backtracking(1)

 

combinations ์‚ฌ์šฉ

from itertools import combinations

N, M = map(int, input().split())

num_list = [num for num in range(1, N + 1)]

for nums in combinations(num_list, M):
    print(" ".join(map(str, list(nums))))