[๋ฐฑ์ค/python] 1992๋ฒ : ์ฟผ๋ํธ๋ฆฌ
๋ฌธ์
ํ๋ฐฑ ์์์ ์์ถํ์ฌ ํํํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ฟผ๋ ํธ๋ฆฌ(Quad Tree)๋ผ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ํฐ ์ ์ ๋ํ๋ด๋ 0๊ณผ ๊ฒ์ ์ ์ ๋ํ๋ด๋ 1๋ก๋ง ์ด๋ฃจ์ด์ง ์์(2์ฐจ์ ๋ฐฐ์ด)์์ ๊ฐ์ ์ซ์์ ์ ๋ค์ด ํ ๊ณณ์ ๋ง์ด ๋ชฐ๋ ค์์ผ๋ฉด, ์ฟผ๋ ํธ๋ฆฌ์์๋ ์ด๋ฅผ ์์ถํ์ฌ ๊ฐ๋จํ ํํํ ์ ์๋ค.
์ฃผ์ด์ง ์์์ด ๋ชจ๋ 0์ผ๋ก๋ง ๋์ด ์์ผ๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ "0"์ด ๋๊ณ , ๋ชจ๋ 1๋ก๋ง ๋์ด ์์ผ๋ฉด ์์ถ ๊ฒฐ๊ณผ๋ "1"์ด ๋๋ค. ๋ง์ฝ 0๊ณผ 1์ด ์์ฌ ์์ผ๋ฉด ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๋ํ๋ด์ง๋ฅผ ๋ชปํ๊ณ , ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋, ์ด๋ ๊ฒ 4๊ฐ์ ์์์ผ๋ก ๋๋์ด ์์ถํ๊ฒ ๋๋ฉฐ, ์ด 4๊ฐ์ ์์ญ์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก๋๋ก ๊ดํธ ์์ ๋ฌถ์ด์ ํํํ๋ค
์ ๊ทธ๋ฆผ์์ ์ผ์ชฝ์ ์์์ ์ค๋ฅธ์ชฝ์ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ์ซ์๋ก ์ฃผ์ด์ง๋ฉฐ, ์ด ์์์ ์ฟผ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์์ถํ๋ฉด "(0(0011)(0(0111)01)1)"๋ก ํํ๋๋ค. N ×N ํฌ๊ธฐ์ ์์์ด ์ฃผ์ด์ง ๋, ์ด ์์์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์ซ์ N ์ด ์ฃผ์ด์ง๋ค. N ์ ์ธ์ ๋ 2์ ์ ๊ณฑ์๋ก ์ฃผ์ด์ง๋ฉฐ, 1 ≤ N ≤ 64์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ๋ ๊ธธ์ด N์ ๋ฌธ์์ด์ด N๊ฐ ๋ค์ด์จ๋ค. ๊ฐ ๋ฌธ์์ด์ 0 ๋๋ 1์ ์ซ์๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์์์ ๊ฐ ์ ๋ค์ ๋ํ๋ธ๋ค.
์ถ๋ ฅ
์์์ ์์ถํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
์ ๋ต
import sys
input = sys.stdin.readline
N = int(input())
video = []
for _ in range(N):
line = input().rstrip()
video.append(line)
def check(start1, end1, start2, end2):
part1 = [[start1, start1 + (end1-start1) // 2],
[start1 + (end1-start1) // 2, end1]]
part2 = [[start2, start2 + (end2-start2) // 2],
[start2 + (end2-start2) // 2, end2]]
result = "("
for a in part1:
for b in part2:
diff = False
bfr = video[a[0]][b[0]] # ์ฒซ๋ฒ์งธ ๊ฐ ์ ์ฅ
for i in range(a[0], a[1]):
for j in range(b[0], b[1]):
if bfr != video[i][j]: # ๋ชจ๋ ๊ฐ์์ง ํ์ธ
diff = True
break
if diff == True: # ๋ค๋ฅธ ์ซ์ ๋ฐ๊ฒฌ, ์ฌ๊ท ํธ์ถ
bfr = check(a[0], a[1], b[0], b[1])
break
result += str(bfr)
result += ")"
return result
answer = check(0, N, 0, N)
# ๋ชจ๋ ๊ฐ์ ์ซ์๋ก๋ง ๋์ด์์ ๋ ๊ดํธ์์ด ์ซ์๋ง answer์ ์ ์ฅ
if len(answer) == 6 and answer[1] == answer[2] == answer[3] == answer[4]:
answer = answer[1]
print(answer)
์ฌ๊ทํจ์ ํธ์ถ์ ์ํด check๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ค.
def check(start1, end1, start2, end2):
part1 = [[start1, start1 + (end1-start1) // 2],
[start1 + (end1-start1) // 2, end1]]
part2 = [[start2, start2 + (end2-start2) // 2],
[start2 + (end2-start2) // 2, end2]]
result = "("
for a in part1:
for b in part2:
diff = False
bfr = video[a[0]][b[0]] # ์ฒซ๋ฒ์งธ ๊ฐ ์ ์ฅ
for i in range(a[0], a[1]):
for j in range(b[0], b[1]):
if bfr != video[i][j]: # ๋ชจ๋ ๊ฐ์์ง ํ์ธ
diff = True
break
if diff == True: # ๋ค๋ฅธ ์ซ์ ๋ฐ๊ฒฌ, ์ฌ๊ท ํธ์ถ
bfr = check(a[0], a[1], b[0], b[1])
break
result += str(bfr)
result += ")"
return result
part1์๋ ์ด์ฐจ์๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค์ ๋ค์ด๊ฐ ์ซ์์ ๋ฒ์๋ค์ ์ ์ฅํ๊ณ
part2์๋ ์ด์ฐจ์๋ฐฐ์ด์ ๋๋ฒ์งธ ์ธ๋ฑ์ค์ ๋ค์ด๊ฐ ์ซ์์ ๋ฒ์๋ค์ ์ ์ฅํ๋ค.
์๋ฅผ ๋ค์ด N=4์ผ ๊ฒฝ์ฐ
[0~1][0~1]
[0~1][2~3]
[2~3][0~1]
[2~3][2~3] ์ผ๋ก 4๊ตฌ์ญ์ผ๋ก ๋๋๊ฒ ๋๋ฏ๋ก
part1์๋ [0,1][2,3]์ด, part2์๋ [0,1][2,3]์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ฐ์ ๊ตฌ์ญ์ ๋ค๋ฅธ ์ซ์๊ฐ ์๋ค๋ฉด diff์ True๋ฅผ ์ ์ฅํ์ฌ ์ฌ๊ทํจ์๋ฅผ ํธ์ถํ๋ค.
answer = check(0, N, 0, N)
# ๋ชจ๋ ๊ฐ์ ์ซ์๋ก๋ง ๋์ด์์ ๋ ๊ดํธ์์ด ์ซ์๋ง answer์ ์ ์ฅ
if len(answer) == 6 and answer[1] == answer[2] == answer[3] == answer[4]:
answer = answer[1]
print(answer)
์ ํจ์๋ฅผ ํธ์ถํ๋ฉด return๊ฐ์ด ๊ดํธ ์์ ์ซ์ ํํ๊ฐ ๋๊ณ
๊ดํธ ์์ ์ซ์๋ 4๊ฐ ์ด์์ด ๋๋ค.
๋ง์ฝ ๊ดํธ ์์ ์ซ์๊ฐ 4๊ฐ๊ณ ๋ชจ๋ ๊ฐ์ ์ซ์๋ผ๋ฉด ๊ดํธ ์์ด ์ซ์๋ง ์ถ๋ ฅ๋์ด์ผํ๋ค.
์๋ฅผ ๋ค์ด (1111)์ด๋ผ๋ฉด 1๋ก ์ถ๋ ฅ๋์ด์ผํ๋ค.
๋ฐ๋ผ์ ์์๊ฐ์ ์๋ฅผ if๋ฌธ์ ์ด์ฉํ์ฌ ๊ฑธ๋ฌ์ค๋ค.
'๐์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/python] 9095๋ฒ : 1, 2, 3 ๋ํ๊ธฐ (0) | 2021.08.06 |
---|---|
[๋ฐฑ์ค/python] 1463๋ฒ : 1๋ก ๋ง๋ค๊ธฐ (0) | 2021.07.29 |
[๋ฐฑ์ค/python] 11866๋ฒ : ์์ธํธ์ค ๋ฌธ์ 0 (0) | 2021.05.12 |
[๋ฐฑ์ค/python] 1541๋ฒ : ์์ด๋ฒ๋ฆฐ ๊ดํธ (0) | 2021.05.12 |
[๋ฐฑ์ค/python] 2231๋ฒ : ๋ถํดํฉ (0) | 2021.05.11 |