์ ์ฒด์ฝ๋
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()๋ฅผ ํ์ฉํด ์ํ ํ ๊ตฌํ
'์๊ณ ๋ฆฌ์ฆ ๐ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์๊ณ ๋ฆฌ์ฆ ๊ฐ๋ ์ ๋ฆฌ] max() ํจ์ ์ ๋ฆฌ_ํ์ด์ฌ (0) | 2025.02.17 | 
|---|---|
| 6. ์๊ธ์ค(ํ)_ํ์ด์ฌ (0) | 2025.02.17 | 
| 3. ํ์ ํ๊ธฐ์ ๋ง๋ค๊ธฐ : infix-->postfix (์คํ) (0) | 2025.02.13 | 
| 2. ์ ๋ง๋๊ธฐ(์คํ)_python (0) | 2025.02.13 | 
| 1. ๊ฐ์ฅ ํฐ ์(์คํ)_python (0) | 2025.02.13 |