https://www.acmicpc.net/problem/1074
ZZZ
์์ด๋์ด
1. ์ซ์๋ฅผ ์ด๋ป๊ฒ ์ฐพ์ง
- ์ฒ์์๋ ๋ฐฐ์ด์ ๋ง๋ค์ด๋ณด๋ ค ํ์ผ๋ ์ต๋๊ธธ์ด๊ฐ 2^15์ธ๊ฑธ ๋ณด๊ณ ์ ์๋ค.
- ๋ถํ ํ์๊ฐ์ด ์๊ฒผ์ง๋ง ํน์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์๊น ๋ด ๊ณ ๋ฏผํ๋ค๊ฐ ๊ทธ๋ฅ ๋ถํ ์ ๋ณต์ผ๋ก ํ๊ธฐ๋ก ํ๋ค.
2. ๊ท์น์ ์ฐพ์์ผ ํด
- ๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ทธ๋ฆผ์ ๋ณด๋ฉด 4๋ฑ๋ถ ํ์ ๋ ๋๋์ด ์จ๋ค.
- 4๋ฑ๋ถ ํ์๋ ๊ฐ๊ฐ์ ์ฒซ ๋ฒ์งธ ์์๊ฐ ์ผ์ ํ ๊ท์น์ด ์๋ค๋ ๊ฒ ๋ณด์ธ๋ค.
- ์๋ฅผ ๋ค์ด N = 3์ผ๋ก ์ฃผ์ด์ก์ ๋ 0 16 32 48์ด๋ค. ์ด๊ฒ์ ๋ค๋ฅด๊ฒ ํํํ๋ฉด 16 * 0, 16 * 1, 16 * 2, 16 * 3
- N์ผ๋ก ํํํ์๋ฉด (2^(N//2)) * 0, (2^(N//2)) * 1, (2^(N//2)) * 2, (2^(N//2)) * 3
- ์ด ๋ฐฉ์์ผ๋ก ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉ์ํค๋ฉด ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก 2*2 ๋ฐฐ์ด์ด ๋์์ ๋ ๊ฐ ์์น์ ๋ง๊ฒ +0, +1, +2, +3์ ํด์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
์ฝ๋ ์ค๋ช
def dfs(row, col, n, value):
n = n // 2
if row < n and col < n:
if n == 1:
print(value)
exit(0)
dfs(row, col, n, value)
elif row < n and col >= n:
if n == 1:
print(value + 1)
exit(0)
dfs(row, col - n, n, value + n ** 2)
elif row >= n and col < n:
if n == 1:
print(value + 2)
exit(0)
dfs(row - n, col, n, value + n ** 2 * 2)
elif row >= n and col >= n:
if n == 1:
print(value + 3)
exit(0)
dfs(row - n, col - n, n, value + n ** 2 * 3)
dfs(r,c,size,0)
๋ถํ ์ ๋ณต ๋ฌธ์ ๋ฅผ ์ฝ๋๋ก ๋ณด๋ฉด ๋ฐ๋ก ์ดํดํ๊ธฐ ์ด๋ ต๋ค. ๋น์ทํ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ ๊ฒ์ด ๋์๋๋ค.
๋จผ์ ํจ์์ ์ธ์๋ก ์ฐ๋ฆฌ๊ฐ ์ฐพ๋ ์์น(r, c)๊ฐ ์ฃผ์ด์ง๊ณ ๋ฐฐ์ด์ ๊ธธ์ด(2**N)์ 0(์ฐ๋ฆฌ๊ฐ ๊ตฌํ๋ ๊ฐ)์ ๋ฐ์์ค๋ค.
ํจ์๋ฅผ ์คํํ๋ฉด ๊ฐ์ฅ๋จผ์ ๋ฐฐ์ด ๊ธธ์ด๋ฅผ ๋ฐ์ผ๋ก ์๋ฅธ๋ค. ์ดํ r, c์ ๊ฐ์ ๋ฐ๋ผ ์ด๋ ์ฌ๋ถ๋ฉด์ผ๋ก ๋ค์ด๊ฐ์ง if๋ฌธ์ ์ฌ์ฉํด ์ฒดํฌํด์ค๋ค.
์ดํ ๋ค์ ํจ์๋ฅผ ํธ์ถํด ์ฃผ๋ฉด ๋๋๋ฐ ์ฌ๊ธฐ์ ์ธ์๋ก ๋ฐ๋ ๊ฐ์ ์ค๋ช ํ์๋ฉด
๋จผ์ r, c๋ ๋ค์ด๊ฐ ์ฌ๋ถ๋ฉด์๋ฐ๋ผ ์ขํ ์กฐ์ ์ ํด์ค๋ค. ์์น๋ฅผ ํญ์ ์๋์ ์ผ๋ก ์๊ฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ฌ์ง์ 12๋ฅผ ๋ณด๋ฉด. ์ฒ์ 4 by 4 ๊ธฐ์ค์ผ๋ก๋ 4 ์ฌ๋ถ๋ฉด์ ์ํด์์ง๋ง, ๋ค์ด๊ฐ์ 2 by 2 ๊ธฐ์ค์ผ๋ก ๋ณด๋ฉด 1 ์ฌ๋ถ๋ฉด์ ์ํด์๋ค.
์ด๋ฌํ ์ด์ ๋ก ์ขํ์กฐ์ ์ ํด์ค๋ค.
๋ค์์ผ๋ก value๊ฐ์ ์์ ์ค๋ช ํ ๊ท์น๋๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๋ง์ง๋ง์ผ๋ก 2 by 2 ์์ ์ด๋ ์ฌ๋ถ๋ฉด์ ์๋์ง ํ๋จํ๊ณ ์์น์ ๋ง๊ฒ ๊ฐ(0, 1, 2, 3)์ ๋ํด ์ถ๋ ฅํด์ฃผ๊ณ exit(0)๋ฅผ ์ฌ์ฉํด ์ข ๋ฃํด์ค๋ค.
์ ์ฒด ์ฝ๋
import sys
sys.setrecursionlimit(10**3)
N, r, c = map(int,input().split())
size = 2**N
def dfs(row, col, n, value):
n = n // 2
if row < n and col < n:
if n == 1:
print(value)
exit(0)
dfs(row, col, n, value)
elif row < n and col >= n:
if n == 1:
print(value + 1)
exit(0)
dfs(row, col - n, n, value + n ** 2)
elif row >= n and col < n:
if n == 1:
print(value + 2)
exit(0)
dfs(row - n, col, n, value + n ** 2 * 2)
elif row >= n and col >= n:
if n == 1:
print(value + 3)
exit(0)
dfs(row - n, col - n, n, value + n ** 2 * 3)
dfs(r,c,size,0)
python 3 ๋ก ์ฑ์ ํด๋ ์ ๋๋ค.
'๐งฉ Problem Solving > [๋ฐฑ์ค]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 5525 IOIOI (python ํ์ด์ฌ) (0) | 2022.07.03 |
---|---|
[๋ฐฑ์ค] 9375 ํจ์ ์ ์ ํด๋น (python ํ์ด์ฌ) (0) | 2022.06.29 |
[๋ฐฑ์ค] 9019 DSLR (python ํ์ด์ฌ) (0) | 2022.06.26 |
[๋ฐฑ์ค] 14500 ํ ํธ๋ก๋ฏธ๋ ธ (python ํ์ด์ฌ) (0) | 2022.06.23 |
[๋ฐฑ์ค] 18111 ๋ง์ธํฌ๋ํํธ (python ํ์ด์ฌ) (4) | 2022.06.23 |