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

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()๋ฅผ ํ™œ์šฉํ•ด ์›ํ˜• ํ ๊ตฌํ˜„