์ ์ฒด์ฝ๋
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 |