[Baekjoon/๐ŸฅˆSilverโ…ก] 6603: ๋กœ๋˜

1 ๋ถ„ ์†Œ์š”

Intro

๋ฌธ์ œ์‚ฌ์ง„ ๋ฌธ์ œ์‚ฌ์ง„

์ ‘๊ทผ ๋ฐฉ๋ฒ•๐Ÿ™‹โ€โ™€๏ธ

  • โ€˜7 1 2 3 4 5 6 7โ€™์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ์ถœ๋ ฅ

    • ์ถœ๋ ฅ๋˜๋Š” ๋กœ๋˜ ๋ฒˆํ˜ธ๋“ค์€ ๋‹ค์Œ์˜ ๊ทธ๋ž˜ํ”„๋“ค๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    • ํ•ด๋‹น ๊ทธ๋ž˜ํ”„๋ฅผ dfs ํƒ์ƒ‰ํ•˜๋ฉฐ ๋ชจ๋“  ๋กœ๋˜ ๋ฒˆํ˜ธ๋“ค์„ ์ถœ๋ ฅํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ™‹โ€โ™€๏ธ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น ๊ทธ๋ž˜ํ”„๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ผ๊นŒ?

  • ๋ชจ๋“  ์ˆ˜๋“ค์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.

  • ์šฐ์„  ์ฒซ ๋ฒˆ์งธ๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋Š” ํ•ด๋‹น ์ˆซ์ž๋ฅผ ํฌํ•จํ•ด ์ด 6๊ฐœ์˜ ์ˆ˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ 'k - 6 + 1'๋ฒˆ์งธ ์ˆซ์ž๊นŒ์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๊ทธ ๋‹ค์Œ์— ์˜ค๋Š” ์ˆ˜๋„ ์œ„ ๋ฐฉ์‹๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ ์ˆ˜๋ฅผ ํฌํ•จํ•ด ๊ทธ ํ›„ ์ˆ˜๋“ค์„ ์„ ํƒํ–ˆ์„ ๋•Œ ๋ฝ‘์•„์•ผํ•˜๋Š” ์ˆ˜๋ฅผ ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š” ์ˆœ์„œ์˜ ์ˆ˜๊นŒ์ง€๋งŒ ์„ ํƒ์„ ํ•˜๋ฉด ๋œ๋‹ค.


์ด๋ ‡๊ฒŒ ๋ง๋กœ๋œ ์„ค๋ช…๋ณด๋‹ค๋Š” ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณด๋Š” ๊ฒƒ์ด ํ›จ ์ดํ•ด๊ฐ€ ์ž˜ ๋  ๊ฒƒ์ด๋‹ค.

Algoritm๐Ÿ‘ฉโ€๐Ÿ’ป: DFS

# 21.01.11
# 6603: ๋กœ๋˜

from copy import deepcopy
from ntpath import join
import sys
sys.setrecursionlimit(10000)

def dfs(i, queue):
  q = deepcopy(queue)
  q.append(lst[i])
  if len(q) == 6:
    print(" ".join(q))
    return
  else:
    for j in range(i+1, k-(6-len(q))+1): # ๊ฐ ์œ„์น˜์— ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋“ค ๊ณ ๋ฅด๊ธฐ
      dfs(j, q)

while 1:
  lst = list(sys.stdin.readline().rstrip().split())
  k = int(lst[0])
  if k == 0:
    break

  lst = lst[1:]
  for i in range(0, k-5): # ์ฒซ ๋ฒˆ์งธ๋กœ ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋“ค ๊ณ ๋ฅด๊ธฐ
    queue = []
    dfs(i, queue)
  print("\n", end="")

๊ฒฐ๊ณผ

โœ์ˆœ์—ด, ์กฐํ•ฉ, ๊ณฑ์ง‘ํ•ฉ

โœ์ˆœ์—ด: Permutation

  • ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ ์ค‘์—์„œ r๊ฐœ๋ฅผ ๊ณจ๋ผ ์ˆœ์„œ๋ฅผ ์ •ํ•ด์„œ ๋‚˜์—ดํ•œ ๊ฒƒ
  • (A, B) != (B, A)
  import itertools

  lst = [1, 2, 3]
  nPr = itertools.permutations(lst, 2)
  print(list(nPr))
  • ๊ฒฐ๊ณผ: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]

โœ์กฐํ•ฉ: Combination

  • ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ ์ค‘์—์„œ r๊ฐœ๋ฅผ ๊ณจ๋ผ ๋‚˜์—ดํ•œ ๊ฒƒ
  • (A, B) == (B, A)
  import itertools

  lst = [1, 2, 3]
  nCr = itertools.combinations(lst, 2)
  print(list(nCr))
  • ๊ฒฐ๊ณผ: [(1, 2), (1, 3), (2, 3)]

โœ๊ณฑ์ง‘ํ•ฉ: Cartesian product

  • ์—ฌ๋Ÿฌ ์ง‘ํ•ฉ๋“ค์—์„œ ํ•˜๋‚˜์”ฉ ๋ฝ‘์•„ ๋งŒ๋“  ์กฐํ•ฉ๋“ค
  import itertools

  lst1 = [1, 2, 3]
  lst2 = ['a', 'b', 'c']
  result = itertools.product(lst1, lst2)
  print(list(result))
  • ๊ฒฐ๊ณผ: [(1, โ€˜aโ€™), (1, โ€˜bโ€™), (1, โ€˜cโ€™), (2, โ€˜aโ€™), (2, โ€˜bโ€™), (2, โ€˜cโ€™), (3, โ€˜aโ€™), (3, โ€˜bโ€™), (3, โ€˜cโ€™)]

Algoritm๐Ÿ‘ฉโ€๐Ÿ’ป: combination

  • ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์—์„œ ์•Œ์•„๋ณธ combination์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž.
import itertools, sys

while 1:
  lst = list(sys.stdin.readline().rstrip().split())
  k = int(lst[0])
  if k == 0:
    break

  result = list(itertools.combinations(lst[1:], 6))
  for i in result:
    print(" ".join(i))

  print()

๊ฒฐ๊ณผ

์ฐธ๊ณ ๐Ÿ“ƒ

๊ทธ๋Ÿผ!! ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์—ฌ๊ธฐ์„œ!!

๋!! ~(ห˜โ–พห˜~)

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ