โ๋ฌธ์
https://www.acmicpc.net/problem/2630
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 111040 KB, ์๊ฐ: 116 ms
๋ถ๋ฅ
๋ถํ ์ ๋ณต, ์ฌ๊ท
๋ฌธ์ ์ค๋ช
์๋ <๊ทธ๋ฆผ 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๊ณผ ๊ฐ ์ ์ฌ๊ฐํ์นธ์ ์(ํ์์ ๋๋ ํ๋์)์ด ์ฃผ์ด์ง ๋ ์๋ผ์ง ํ์์ ์์ข ์ด์ ํ๋์ ์์ข ์ด์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โ๐ปํ์ด
์ฃผ์ด์ง ์ข ์ด๋ฅผ ํ์ธํ๋ฉฐ ์ฒ์ ์๊ณผ ๋ค๋ฅธ ์์ด ๋์ค๋ฉด ์ข ์ด๋ฅผ ๋๋๋ค.
ํ ์คํธ์ผ์ด์ค๋ก ํ์ธํด๋ณด์๋ฉด (0, 0)์ ํ๋์์ด๋ค. ๊ทธ๋ฌ๋ (0, 2)๋ฅผ ๋ณด๋ฉด ํ์์์ด ๋๋ค. ์์ด ๋ฌ๋ผ์ก์ผ๋ฏ๋ก ์ข ์ด๋ฅผ 4๋ฑ๋ถํ๋ค. 4๋ฑ๋ถ์ ํ๋ฉด ๊ฐ๊ฐ ์ข ์ด์ ์์ ์์น๋ (0, 0), (0, 4), (4, 0), (4, 4)๊ฐ ๋๋ค. ๋ฐ๋ณต์ ์ผ๋ก ํ์ธํ๋ฉด์ ์์ด ๋ค๋ฅธ ๋ถ๋ถ์ด ๋์ค์ง ์์๋ค๋ฉด ์ฒซ๋ฒ์งธ ์ข ์ด ์์ ๋ฐ๋ผ ๊ฐ๊ฐ์ ๊ฐ์๋ฅผ ์ธ๋ฉด ๋๋ค.
๐ป์ฝ๋
import sys
input = sys.stdin.readline
N = int(input())
paper = [list(map(int, input().split())) for _ in range(N)]
blue, white = 0, 0
def divide_and_conquer(y, x, n):
global blue, white
color = paper[y][x]
for i in range(y, y+n):
for j in range(x, x+n):
if color != paper[i][j]:
divide_and_conquer(y, x, n//2)
divide_and_conquer(y + n//2, x, n//2)
divide_and_conquer(y, x + n//2, n//2)
divide_and_conquer(y + n//2, x + n//2, n//2)
return
if color == 1:
blue += 1
else:
white += 1
divide_and_conquer(0, 0, N)
print(white, blue, sep='\n')
๐ํ๊ธฐ
์ฒ์์๋ all๋ก graph[:N//2][:N//2]๊ฐ ๋ชจ๋ 1์ธ์ง 0์ธ์ง๋ก ํ์ธํ๋ ค๊ณ ์๋ํด๋ดค๋๋ฐ ์ด ๋ฐฉ๋ฒ์ ๋์ง ์๋ ๊ฒ ๊ฐ๋ค. all์ด๋ any๋ ์ด๋จ ๋ ์ฐ๋ ๊ฒ ์ข์์ง ๋ชจ๋ฅด๊ฒ ๋ค...
'Coding Test > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 1504. ํน์ ํ ์ต๋จ ๊ฒฝ๋ก/Python - Gold4 (0) | 2025.08.12 |
---|---|
[๋ฐฑ์ค] 9655. ๋ ๊ฒ์/Python - Silver5 (2) | 2025.08.11 |
[๋ฐฑ์ค] 11404. ํ๋ก์ด๋/Python - Gold4 (0) | 2025.08.07 |
[๋ฐฑ์ค] 14500. ํ ํธ๋ก๋ฏธ๋ ธ/Python - Gold4 (2) | 2025.08.06 |
[๋ฐฑ์ค] 14502. ์ฐ๊ตฌ์/Python - Gold4 (0) | 2025.08.03 |