๊ด€๋ฆฌ ๋ฉ”๋‰ด

Keep Going

[BOJ] 6603 ๋กœ๋˜ ๋ณธ๋ฌธ

Problem Solving

[BOJ] 6603 ๋กœ๋˜

seon 2024. 4. 29.
๋ฐ˜์‘ํ˜•

๐Ÿ’ก๋ฌธ์ œ ๋ถ„์„ ์š”์•ฝ

  • {1,2, .. ,49}์—์„œ 6๊ฐœ์˜ ์ˆ˜๋ฅผ ๊ณจ๋ผ ๋กœ๋˜๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ๋กœ๋˜ ์ „๋žต : k(k>6)๊ฐœ์˜ ์ˆ˜๋ฅผ ๊ณจ๋ผ ์ง‘ํ•ฉ S๋ฅผ ๋งŒ๋“  ๋‹ค์Œ → ๊ทธ ์ˆ˜๋งŒ ๊ฐ€์ง€๊ณ  ๋ฒˆํ˜ธ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • k=8, S={1,2,3,5,8,13,21,34}์ธ ๊ฒฝ์šฐ ์ด ์ง‘ํ•ฉ S์—์„œ ์ˆ˜๋ฅผ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ด 28๊ฐ€์ง€์ด๋‹ค. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34])
  • ์ง‘ํ•ฉ S์™€ k๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ˆ˜๋ฅผ ๊ณ ๋ฅด๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ๊ตฌํ•ด๋ผ ~
    • ⇒ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•ด์„œ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— dfs ์‚ฌ์šฉ
  • ์˜ค ~ ์ž…๋ ฅ ๋ฐฉ๋ฒ•์ด ํŠน์ดํ•˜๊ตฐ !

์ž…์ถœ๋ ฅ

  • ์ž…๋ ฅ
    7 1 2 3 4 5 6 7 # k(6<k<13), k๊ฐœ์˜ ์ˆ˜(์ง‘ํ•ฉ S์— ํฌํ•จ๋˜๋Š” ์ˆ˜, ์˜ค๋ฆ„์ฐจ์ˆœ)
    8 1 2 3 5 8 13 21 34 # same
    0 # ์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ์ค„์—๋Š” 0์ด ํ•˜๋‚˜๊ฐ€ ์ฃผ์–ด์ง ~
  • ์ถœ๋ ฅ
    1 2 3 4 5 6 # ๊ฐ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋งˆ๋‹ค ์ˆ˜๋ฅผ ๊ณ ๋ฅด๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ• ์ถœ๋ ฅ(์˜ค๋ฆ„์ฐจ์ˆœ)
    1 2 3 4 5 7
    1 2 3 4 6 7
    1 2 3 5 6 7
    1 2 4 5 6 7
    1 3 4 5 6 7
    2 3 4 5 6 7

    # ํ…Œ์ผ€ ์‚ฌ์ด์—๋Š” ๋นˆ ์ค„ ํ•˜๋‚˜ ~
    1 2 3 5 8 13
    1 2 3 5 8 21
    1 2 3 5 8 34
    1 2 3 5 13 21
    1 2 3 5 13 34
    1 2 3 5 21 34
    1 2 3 8 13 21
    1 2 3 8 13 34
    1 2 3 8 21 34
    1 2 3 13 21 34
    1 2 5 8 13 21
    1 2 5 8 13 34
    1 2 5 8 21 34
    1 2 5 13 21 34
    1 2 8 13 21 34
    1 3 5 8 13 21
    1 3 5 8 13 34
    1 3 5 8 21 34
    1 3 5 13 21 34
    1 3 8 13 21 34
    1 5 8 13 21 34
    2 3 5 8 13 21
    2 3 5 8 13 34
    2 3 5 8 21 34
    2 3 5 13 21 34
    2 3 8 13 21 34
    2 5 8 13 21 34
    3 5 8 13 21 34

6 < k < 13

์‹œ๊ฐ„์ œํ•œ : 1์ดˆ

๐Ÿ’ก์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

  1. ์ž…๋ ฅ๊ฐ’ ๋ฐ›๊ธฐ
  2. ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ๋Œ๋ฉด์„œ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ˆ˜์ง‘(dfs ์‹คํ–‰, ํ…Œ์ผ€ ์‚ฌ์ด ๋นˆ์ค„ ์„ธํŒ…)
  3. ๊ฒฐ๊ณผ ์ถœ๋ ฅ

๐Ÿ’ก์ฝ”๋“œ

31120 KB / 44 ms

import sys
sys.setrecursionlimit(10**6)

# dfs - backtraking ๋ฐฉ๋ฒ•
def dfs_backtracking(s, idx, ans):
    # 2. ๋ชฉ์ ์ง€์ธ๊ฐ€? 6๊ฐœ ๋กœ๋˜ ๋ฒˆํ˜ธ๋ฅผ ํƒ์ƒ‰ํ•จ
    if len(ans)==6:
        print(*ans)
        return 
    
    # 3. ์ธ์ ‘ํ•œ ๊ณณ ๋Œ๊ธฐ
    for i in range(idx+1, len(s)):
        # 4. ๊ฐˆ ์ˆ˜ ์žˆ๋‚˜?
        if s[i] not in ans:
            # 1. ์ฒดํฌ์ธ
            ans.append(s[i])
            # 5. ๊ฐ€์ž.
            dfs_backtracking(s,i,ans)
            ans.pop()

# dfs - ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•
def dfs_new_list(s,idx,ans):
    global result
    # 1. ์ฒดํฌ์ธ
    ans = ans+[s[idx]]

    # 2. ๋ชฉ์ ์ง€์ธ๊ฐ€?
    if len(ans)==6:
        form = ' '.join(map(str, ans))
        result.append(form)
        # print(*ans)
        return
    
    # 3. ์ธ์ ‘ํ•œ ๊ณณ ๋Œ๊ธฐ
    for i in range(idx+1, len(s)):
        # 4. ๊ฐˆ ์ˆ˜ ์žˆ๋‚˜?
        if s[i] not in ans:
            # 5. ๊ฐ€์ž.
            dfs_new_list(s,i,ans)

# ์ˆซ์ž ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด์•ผ ํ•จ = ํŒŒ๊ณ  ๋“œ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์ค‘์š”ํ•จ (dfs)
def solution():
    # 1. ์ž…๋ ฅ ๊ฐ’ ๋ฐ›๊ธฐ
    tc = []
    while True:
        line = sys.stdin.readline().strip()
        if line[0] == '0':
            break
        
        # ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜์ง€?
            # line[0] : k๊ฐœ์˜ ์ˆ˜
            # line[1:] : ์ง‘ํ•ฉ S

        # k = int(line[0])
        # s = list(map(int, line[1:].split()))

        parts = list(map(int, line.split()))
        k = parts[0]
        s = parts[1:]
        tc.append({'k':k, 's':s})
    
    # 2. ์„ธํŒ…
    result = []

    for i in range(len(tc)):
        k = tc[i]['k']
        s = tc[i]['s']
        
        # ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹
        for idx, num in enumerate(s):
            dfs_new_list(s,idx,[])
        
        # ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฐฉ์‹
        # for idx_ in range(len(s)):
        #     dfs_backtracking(s,idx_,[s[idx_]])

        result.append("") # ๋นˆ์ค„ ์ถ”๊ฐ€

    result.pop() # ๋นˆ์ค„ ์ œ๊ฑฐ 

    print('\\n'.join(result))

if __name__ == "__main__":
    solution()

๐Ÿ’ก์‹œ๊ฐ„๋ณต์žก๋„

O(k^2)

๐Ÿ’ก ํ‹€๋ฆฐ ์ด์œ 

  • ์ถœ๋ ฅ ๋ฐฉ์‹์„ ํ‹€๋ฆผ
  • ์กฐํ•ฉ์„ ๋งŒ๋“ค์–ด์„œ ๋งค๋ฒˆ ์ €์žฅํ•˜๋Š” ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ• ์ง€ ๋ชฐ๋ž์Œ

๐Ÿ’ก ํ‹€๋ฆฐ ๋ถ€๋ถ„ ์ˆ˜์ • or ๋‹ค๋ฅธ ํ’€์ด

์ž…๋ ฅ ๋ฐ›์•„์˜ค๋Š” ๋ถ€๋ถ„ 2๊ฐ€์ง€ ํ’€์ด ๋ฐฉ๋ฒ•

    while True:
        line = sys.stdin.readline().strip()
        if line[0] == '0':
            break
        
        # ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜์ง€?
            # line[0] : k๊ฐœ์˜ ์ˆ˜
            # line[1:] : ์ง‘ํ•ฉ S

        # ๋ฐฉ๋ฒ• 1
        k = int(line[0])
        s = list(map(int, line[1:].split()))

				# ๋ฐฉ๋ฒ• 2
        parts = list(map(int, line.split()))
        k = parts[0]
        s = parts[1:]
        
        # ์—ฌ๊ธด ๊ณตํ†ต
        tc.append({'k':k, 's':s})

๐Ÿ’ก ๋А๋‚€์  or ๊ธฐ์–ตํ• ์ •๋ณด

  • ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ vs ๋ฐฑํŠธ๋ž˜ํ‚น
    • ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹
      • ans = ans + [s[idx]] ์ด๋ ‡๊ฒŒ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค์–ด์„œ ์žฌ๊ท€ ํ˜ธ์ถœ์— ์ „๋‹ฌ
      • ๊ฐ ์žฌ๊ท€ ํ˜ธ์ถœ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ์— ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์‚ฌ ๊ณผ์ •, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ณผ์ •์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • def dfs_new_list(s,idx,ans): global result # 1. ์ฒดํฌ์ธ : ans = ans+[s[idx]] # 2. ๋ชฉ์ ์ง€์ธ๊ฐ€? if len(ans)==6: form = ' '.join(map(str, ans)) result.append(form) return # 3. ์ธ์ ‘ํ•œ ๊ณณ ๋Œ๊ธฐ for i in range(idx+1, len(s)): # 4. ๊ฐˆ ์ˆ˜ ์žˆ๋‚˜? if s[i] not in ans: # 5. ๊ฐ€์ž. dfs_new_list(s,i,ans)
    • ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฐฉ์‹
      • ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
        • ans ๋ฆฌ์ŠคํŠธ์— appendํ•˜๊ณ  → ์žฌ๊ท€ ํ˜ธ์ถœ ๋๋‚œ ํ›„ → ans์—์„œ pop ํ•˜๊ธฐ
        • ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ, ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ํ•„์š”ํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/๋ณต์‚ฌ ๋น„ ์šฉ์ด ๋“ค์ง€ ์•Š์Œ.
      • e.g., ans.append(6) → dfs_backtraking(s,i,[1,2,3,4,5,6]) → len==6์ด ๋˜์–ด return๋˜์—ˆ์„ ๋•Œ → ans.pop() ์‹คํ–‰์œผ๋กœ ans = [1,2,3,4,5]๊ฐ€ ๋˜๊ณ  → for i in range(idx+1, len(s)): ๋ฌธ์„ ์ด์–ด ๋Œ๋ฉด์„œ if 8 not in ans: ans.append(8) dfs_backtracking(s,i,[1,2,3,4,5,8]) ๋ญ ์š”๋Ÿฐ ์‹์œผ๋กœ ๋˜๋Š”๊ฑฐ์ง€ ~ you know ~~?
    • def dfs_backtracking(s, idx, ans): # 2. ๋ชฉ์ ์ง€์ธ๊ฐ€? 6๊ฐœ ๋กœ๋˜ ๋ฒˆํ˜ธ๋ฅผ ํƒ์ƒ‰ํ•จ if len(ans)==6: print(*ans) return # 3. ์ธ์ ‘ํ•œ ๊ณณ ๋Œ๊ธฐ for i in range(idx+1, len(s)): # 4. ๊ฐˆ ์ˆ˜ ์žˆ๋‚˜? if s[i] not in ans: # 1. ์ฒดํฌ์ธ ans.append(s[i]) # 5. ๊ฐ€์ž. dfs_backtracking(s,i,ans) ans.pop()
    • 2๊ฐœ์˜ ๋ฐฉ์‹ ๋น„๊ต
      • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ : ๋ฐฑํŠธ๋ž˜ํ‚น > ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ (์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๊ฐ€ ๊ฐ ์žฌ๊ท€๋งˆ๋‹ค ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ ์ค‘์ฒฉ๋œ ์žฌ๊ท€๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•จ)
      • ์‹คํ–‰ ์‹œ๊ฐ„ : ๋ฐฑํŠธ๋ž˜ํ‚น > ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ (๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ, ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์— ์กด์žฌํ•œ๋‹ค)
      • BUT ์ด ๋ฌธ์ œ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ/์‹œ๊ฐ„์ด ๋˜‘๊ฐ™์ด ๋‚˜์˜ด !
    • ๊ฒฐ๋ก ์ ์œผ๋กœ, ์žฌ๊ท€์  ์กฐํ•ฉ ์ƒ์„ฑ ๋ฌธ์ œ์—์„œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฐฉ์‹์ด ๋” ์‰ฝ๋‹ค.
  • ์ถœ๋ ฅ format, ์ž…๋ ฅ format ๋งž์ถ”๊ธฐ ์–ด๋ ค์› ๋‹ค. ํŠนํžˆ ์ถœ๋ ฅ format์—์„œ tc ํ•˜๋‚˜ ๋๋‚  ๋–„ ๋งˆ๋‹ค ๋นˆ ์ค„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์„ res = [] ์ด๋ ‡๊ฒŒ ๋นˆ ์ถœ๋ ฅ ๋ฐฐ์—ด ๋งŒ๋“ค๊ณ , tc ๋๋‚  ๋•Œ ๋งˆ๋‹ค res.append(””)๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ tc ๋๋‚˜๊ณ ๋Š” ๋นˆ ์ค„์ด ์žˆ์œผ๋ฉด ์•ˆ๋˜๋‹ˆ๊นŒ res.pop()ํ–ˆ๋‹ค.
๋ฐ˜์‘ํ˜•