[๋ฐฑ์ค/python] 2630๋ฒ : ์์ข ์ด ๋ง๋ค๊ธฐ
๋ฌธ์
์๋ <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ ์ ์ฌ๊ฐํ์นธ๋ค๋ก ์ด๋ฃจ์ด์ง ์ ์ฌ๊ฐํ ๋ชจ์์ ์ข ์ด๊ฐ ์ฃผ์ด์ ธ ์๊ณ , ๊ฐ ์ ์ฌ๊ฐํ๋ค์ ํ์์์ผ๋ก ์น ํด์ ธ ์๊ฑฐ๋ ํ๋์์ผ๋ก ์น ํด์ ธ ์๋ค. ์ฃผ์ด์ง ์ข ์ด๋ฅผ ์ผ์ ํ ๊ท์น์ ๋ฐ๋ผ ์๋ผ์ ๋ค์ํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์ฌ๊ฐํ ๋ชจ์์ ํ์์ ๋๋ ํ๋์ ์์ข ์ด๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค.
์ ์ฒด ์ข ์ด์ ํฌ๊ธฐ๊ฐ N×N(N=2k, k๋ 1 ์ด์ 7 ์ดํ์ ์์ฐ์) ์ด๋ผ๋ฉด ์ข ์ด๋ฅผ ์๋ฅด๋ ๊ท์น์ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ฒด ์ข ์ด๊ฐ ๋ชจ๋ ๊ฐ์ ์์ผ๋ก ์น ํด์ ธ ์์ง ์์ผ๋ฉด ๊ฐ๋ก์ ์ธ๋ก๋ก ์ค๊ฐ ๋ถ๋ถ์ ์๋ผ์ <๊ทธ๋ฆผ 2>์ I, II, III, IV์ ๊ฐ์ด ๋๊ฐ์ ํฌ๊ธฐ์ ๋ค ๊ฐ์ N/2 × N/2์์ข ์ด๋ก ๋๋๋ค. ๋๋์ด์ง ์ข ์ด I, II, III, IV ๊ฐ๊ฐ์ ๋ํด์๋ ์์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ๊ฐ์ ์์ผ๋ก ์น ํด์ ธ ์์ง ์์ผ๋ฉด ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋๊ฐ์ ํฌ๊ธฐ์ ๋ค ๊ฐ์ ์์ข ์ด๋ก ๋๋๋ค. ์ด์ ๊ฐ์ ๊ณผ์ ์ ์๋ผ์ง ์ข ์ด๊ฐ ๋ชจ๋ ํ์์ ๋๋ ๋ชจ๋ ํ๋์์ผ๋ก ์น ํด์ ธ ์๊ฑฐ๋, ํ๋์ ์ ์ฌ๊ฐํ ์นธ์ด ๋์ด ๋ ์ด์ ์๋ฅผ ์ ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
์์ ๊ฐ์ ๊ท์น์ ๋ฐ๋ผ ์๋์ ๋ <๊ทธ๋ฆผ 3>์ <๊ทธ๋ฆผ 1>์ ์ข ์ด๋ฅผ ์ฒ์ ๋๋ ํ์ ์ํ๋ฅผ, <๊ทธ๋ฆผ 4>๋ ๋ ๋ฒ์งธ ๋๋ ํ์ ์ํ๋ฅผ, <๊ทธ๋ฆผ 5>๋ ์ต์ข ์ ์ผ๋ก ๋ง๋ค์ด์ง ๋ค์ํ ํฌ๊ธฐ์ 9์ฅ์ ํ์์ ์์ข ์ด์ 7์ฅ์ ํ๋์ ์์ข ์ด๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ข ์ด์ ํ ๋ณ์ ๊ธธ์ด N๊ณผ ๊ฐ ์ ์ฌ๊ฐํ์นธ์ ์(ํ์์ ๋๋ ํ๋์)์ด ์ฃผ์ด์ง ๋ ์๋ผ์ง ํ์์ ์์ข ์ด์ ํ๋์ ์์ข ์ด์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ ์ฒด ์ข ์ด์ ํ ๋ณ์ ๊ธธ์ด N์ด ์ฃผ์ด์ ธ ์๋ค. N์ 2, 4, 8, 16, 32, 64, 128 ์ค ํ๋์ด๋ค. ์์ข ์ด์ ๊ฐ ๊ฐ๋ก์ค์ ์ ์ฌ๊ฐํ์นธ๋ค์ ์์ด ์์ค๋ถํฐ ์ฐจ๋ก๋ก ๋์งธ ์ค๋ถํฐ ๋ง์ง๋ง ์ค๊น์ง ์ฃผ์ด์ง๋ค. ํ์์์ผ๋ก ์น ํด์ง ์นธ์ 0, ํ๋์์ผ๋ก ์น ํด์ง ์นธ์ 1๋ก ์ฃผ์ด์ง๋ฉฐ, ๊ฐ ์ซ์ ์ฌ์ด์๋ ๋น์นธ์ด ํ๋์ฉ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ์๋ผ์ง ํ์์ ์์ข ์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๊ณ , ๋์งธ ์ค์๋ ํ๋์ ์์ข ์ด์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ๋ต
import sys
input = sys.stdin.readline
N = int(input())
colors = []
for n in range(N):
colors.append(list(map(int, input().split())))
white = 0
blue = 0
def check(start_i, start_j, n):
global white, blue
std = colors[start_i][start_j]
for i in range(start_i, start_i + n):
for j in range(start_j, start_j + n):
if std != colors[i][j]:
check(start_i, start_j, n//2)
check(start_i, start_j + n//2, n//2)
check(start_i + n//2, start_j, n//2)
check(start_i + n//2, start_j + n//2, n//2)
return
if std == 0:
white += 1
else:
blue += 1
return
check(0, 0, N)
print(white)
print(blue)
def check(start_i, start_j, n):
global white, blue
std = colors[start_i][start_j]
for i in range(start_i, start_i + n):
for j in range(start_j, start_j + n):
if std != colors[i][j]:
check(start_i, start_j, n//2)
check(start_i, start_j + n//2, n//2)
check(start_i + n//2, start_j, n//2)
check(start_i + n//2, start_j + n//2, n//2)
return
if std == 0:
white += 1
else:
blue += 1
return
๊ธฐ์ค๊ฐ std์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ ๊ฐ colors[start_i][start_j]๋ฅผ ์ ์ฅํ๋ค.
n์ start๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ๋ก, start_i๋ถํฐ start_i + n๊น์ง, start_j๋ถํฐ start_j + n๊น์ง์ ๊ฑฐ๋ฆฌ๋งํผ ๋ฐ๋ณตํ๋ค.
๋ง์ฝ colors[i][j]์ ๊ฐ์ด ๊ธฐ์ค๊ฐ std์ ๊ฐ์ง ์๋ค๋ฉด ์ชผ๊ฐ์ผํ๋ค๋ ๋ป์ด๋ฏ๋ก
start ๊ฐ์ ์กฐ์ ํ์ฌ 4๊ฐ๋ก ์ชผ๊ฐ check๋ฅผ ๋ค์ ํธ์ถํ์ฌ ์ฌ๊ทํจ์๋ฅผ ์์ฑํ๋ค.
๋ฐ์ผ๋ก ์ชผ๊ฐ๋ฏ๋ก n๊ฐ์ ํญ์ n//2๊ฐ ๋์ด ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๊ณ
๊ฐ๊ฐ์ ์ฒซ ๊ธฐ์ค์ ์ start_i์ start_j๋ก ์ค์ ํ๋ค.
๋ง์ฝ ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋์๋ค๋ฉด ๋ชจ๋ ์นธ์ ์ซ์๊ฐ ๊ธฐ์ค๊ฐ๊ณผ ๊ฐ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก
๊ธฐ์ค๊ฐ์ ๋ฐ๋ผ white ๋๋ blue์ ๊ฐ์ 1 ์ฆ๊ฐ์ํจ๋ค.
'๐์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/python] 15650๋ฒ : N๊ณผ M (0) | 2021.04.11 |
---|---|
[๋ฐฑ์ค/python] 2667๋ฒ : ๋จ์ง๋ฒํธ ๋ถ์ด๊ธฐ (0) | 2021.04.07 |
[๋ฐฑ์ค/python] 14889๋ฒ : ์คํํธ์ ๋งํฌ (0) | 2021.04.05 |
[๋ฐฑ์ค/python] 1260๋ฒ : DFS์ BFS (0) | 2021.04.05 |
[๋ฐฑ์ค/python] 2108๋ฒ : ํต๊ณํ (0) | 2021.04.02 |