๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๐Ÿ’ก

5. ๊ณต์ฃผ๊ตฌํ•˜๊ธฐ(ํ)_ํŒŒ์ด์ฌ

by @ENFJ 2025. 2. 17.

์ „์ฒด์ฝ”๋“œ

import sys
from collections import deque
# ์ž…๋ ฅ๊ฐ’: 8 3
sys.stdin=open("C:\\input.txt",'rt')
n, k = map(int,input().split())
print(n,k)

dq= list(range(1,n+1))
dq = deque(dq)
print(dq)

while dq:
    for _ in range(k-1):
        cur = dq.popleft()
        dq.append(cur)
    dq.popleft()

    if len(dq) == 1:
        print(dq[0])
        dq.popleft()

 


 

์ด ์ฝ”๋“œ๋Š” ์š”์„ธํ‘ธ์Šค ๋ฌธ์ œ(Josephus Problem)๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
ํ(Deque)๋ฅผ ํ™œ์šฉํ•ด์„œ ์›ํ˜•์œผ๋กœ ์‚ฌ๋žŒ์„ ์ œ๊ฑฐํ•˜๋ฉด์„œ ๋งˆ์ง€๋ง‰ ๋‚จ์€ ์‚ฌ๋žŒ์„ ์ฐพ๋Š” ๋ฐฉ์‹๐Ÿš€


๐Ÿ“Œ ์š”์„ธํ‘ธ์Šค ๋ฌธ์ œ๋ž€?

  • 1๋ฒˆ๋ถ€ํ„ฐ n๋ฒˆ๊นŒ์ง€ ์›ํ˜•์œผ๋กœ ์•‰์•„ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ์–ด.
  • k๋ฒˆ์งธ ์‚ฌ๋žŒ์„ ๊ณ„์† ์ œ๊ฑฐํ•˜๋ฉด์„œ ๋งˆ์ง€๋ง‰ ๋‚จ์€ ์‚ฌ๋žŒ์„ ์ฐพ๋Š” ๋ฌธ์ œ!

๐Ÿ“ ์˜ˆ์ œ: n = 8, k = 3

 
์ดˆ๊ธฐ ์ƒํƒœ: [1, 2, 3, 4, 5, 6, 7, 8] 
(3๋ฒˆ์งธ ์ œ๊ฑฐ) → 3 ์ œ๊ฑฐ → [1, 2, 4, 5, 6, 7, 8] 
(3๋ฒˆ์งธ ์ œ๊ฑฐ) → 6 ์ œ๊ฑฐ → [1, 2, 4, 5, 7, 8] 
(3๋ฒˆ์งธ ์ œ๊ฑฐ) → 9 ์ œ๊ฑฐ → [1, 2, 4, 5, 7] ... ๋งˆ์ง€๋ง‰ ๋‚จ์€ ์‚ฌ๋žŒ: ?

์ด ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฑฐ์•ผ!


๐Ÿ” ์ฝ”๋“œ ๋ถ„์„

1๏ธโƒฃ ์ž…๋ ฅ ์ฒ˜๋ฆฌ

 
import sys from collections 
import deque sys.stdin = open("C:\\input.txt", 'rt') 
n, k = map(int, input().split()) print(n, k)
  • n, k๋ฅผ ์ž…๋ ฅ๋ฐ›์Œ
  • ์˜ˆ์ œ ์ž…๋ ฅ: 8 3 → n = 8, k = 3
  • print(n, k) → ์ž…๋ ฅ๊ฐ’ ํ™•์ธ์šฉ (์‹ค์ œ ๋กœ์ง์—๋Š” ํ•„์š” ์—†์Œ)

2๏ธโƒฃ ํ(Deque) ์ดˆ๊ธฐํ™”

 
dq = list(range(1, n + 1)) 
dq = deque(dq) 
print(dq)
  • range(1, n+1) → [1, 2, 3, ..., n] ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
  • deque(dq) → ํ(Deque)๋กœ ๋ณ€ํ™˜
    (๋ฆฌ์ŠคํŠธ๋กœ ํ•ด๋„ ๋˜์ง€๋งŒ, deque๋ฅผ ์“ฐ๋ฉด popleft()๊ฐ€ O(1)๋กœ ๋” ๋น ๋ฆ„!) 

๐Ÿ’ก deque๋ž€?

  • ์–‘์ชฝ ๋์—์„œ ๋น ๋ฅด๊ฒŒ ์‚ฝ์ž…/์‚ญ์ œ ๊ฐ€๋Šฅ
  • popleft() → O(1), append() → O(1)
    (์ผ๋ฐ˜ ๋ฆฌ์ŠคํŠธ๋Š” pop(0)์ด O(n)์œผ๋กœ ๋А๋ฆผ)

3๏ธโƒฃ ์š”์„ธํ‘ธ์Šค ์ˆœ์—ด ๊ณ„์‚ฐ

python
๋ณต์‚ฌํŽธ์ง‘
while len(dq) > 1: 
for _ in range(k-1): # k-1๋ฒˆ ์•ž์—์„œ ๋นผ์„œ ๋’ค๋กœ ์ด๋™ 
cur = dq.popleft() 
dq.append(cur) 
dq.popleft() # k๋ฒˆ์งธ ์‚ฌ๋žŒ ์ œ๊ฑฐ
  • (k-1)๋ฒˆ ์•ž์—์„œ ๋นผ์„œ ๋’ค๋กœ ๋ณด๋ƒ„
    → popleft() ํ›„ append()
  • k๋ฒˆ์งธ ์‚ฌ๋žŒ์„ ์ œ๊ฑฐ
    → popleft() (๊ทธ๋ƒฅ ๋ฒ„๋ฆผ)

4๏ธโƒฃ ๋งˆ์ง€๋ง‰ ๋‚จ์€ ์‚ฌ๋žŒ ์ถœ๋ ฅ

 
print(dq[0])
  • ํ์— ๋‚จ์€ ๋งˆ์ง€๋ง‰ ์‚ฌ๋žŒ์„ ์ถœ๋ ฅ!

๐Ÿ’ก ์‹คํ–‰ ์˜ˆ์ œ

์ž…๋ ฅ

8 3

ํ ์ƒํƒœ ๋ณ€ํ™”

๋‹จ๊ณ„ํ ์ƒํƒœ (dq)์ œ๊ฑฐ๋œ ์‚ฌ๋žŒ

์ดˆ๊ธฐ [1, 2, 3, 4, 5, 6, 7, 8] -
1 [4, 5, 6, 7, 8, 1, 2] 3
2 [7, 8, 1, 2, 4, 5] 6
3 [2, 4, 5, 7, 8] 1
4 [7, 8, 2, 4] 5
5 [4, 7, 8] 2
6 [4, 7] 8
7 [7] 4

์ถœ๋ ฅ ๊ฒฐ๊ณผ

 
7

โžก ๋งˆ์ง€๋ง‰ ๋‚จ์€ ์‚ฌ๋žŒ: 7


โณ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

์—ฐ์‚ฐ๋ณต์žก๋„

popleft() O(1)
append() O(1)
while len(dq) > 1 O(n) (๋ฐ˜๋ณต๋ฌธ)
๋‚ด๋ถ€ for ๋ฃจํ”„ O(k) (๋งค๋ฒˆ k-1๋ฒˆ ์ด๋™)
  • ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n * k)
  • k๊ฐ€ ์ž‘์„์ˆ˜๋ก ๋น ๋ฆ„, k ≈ n์ด๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n²)
  • n์ด ํด ๊ฒฝ์šฐ k-1๋ฒˆ ์ด๋™ ๋Œ€์‹  rotate(-k)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด O(n) ๊ฐ€๋Šฅ!

โœ… ์ •๋ฆฌ

โœ… ์š”์„ธํ‘ธ์Šค ๋ฌธ์ œ ํ•ด๊ฒฐ (ํ ์‚ฌ์šฉ)
โœ… Deque ํ™œ์šฉ → O(n * k) → rotate()๋กœ O(n) ์ตœ์ ํ™” ๊ฐ€๋Šฅ
โœ… popleft() & append()๋ฅผ ํ™œ์šฉํ•ด ์›ํ˜• ํ ๊ตฌํ˜„