문제

https://www.acmicpc.net/problem/2630

풀이

최초 풀이

  • 0, 0 좌표의 값을 저장한다.
  • x, y 좌표까지 모두 훑으면서 0, 0 좌표와 색을 비교한다.
  • 다른 값 발견시 4분면으로 분화시켜서 재귀를 돌린다.
def slice(fromx, tox, fromy, toy):
    global paper, white, blue
    color = paper[fromx][fromy]

    check = 1
    for x in range(fromx, tox):
        if check == 0: break
        for y in range(fromy, toy):
            if paper[x][y] != color:
                slice(fromx, tox // 2, fromy, toy // 2) # 1
                slice(tox // 2, tox, fromy, toy // 2) # 4
                slice(fromx, tox // 2, toy // 2, toy) # 2
                slice(tox // 2, tox, toy // 2, toy) # 3
                check = 0
                break

    if check and color == 0: white += 1
    if check and color == 1: blue += 1

n = int(input())
paper = []
for _ in range(n):
    paper.append(list(map(int, input().split())))

white, blue = 0, 0
slice(0, n, 0, n)
print(white, blue)

접근 방식은 올바랐으나, tox, toy 나누기로 인해
인자를 잘못 받아 재귀를 무한하게 돌고있었다.

이 때문에 tox, toy를 직접 나누어 구하는 방식 말고
n 값을 나눠서 더하는 걸로 바꾸어 보았다.

2차 풀이

def slice(x, y, n):
    global paper, white, blue
    color = paper[x][y]

    check = 1
    for i in range(x, x+n):
        if check == 0: break
        for j in range(y, y+n):
            if paper[i][j] != color:
                slice(x, y, n//2) # 1
                slice(x+n//2, y, n//2) # 4
                slice(x, y+n//2, n//2) # 2
                slice(x+n//2, y+n//2, n//2) # 3
                check = 0
                break

    if check and color == 0: white += 1
    if check and color == 1: blue += 1

n = int(input())
paper = []
for _ in range(n):
    paper.append(list(map(int, input().split())))

white, blue = 0, 0
slice(0, 0, n)
print(white)
print(blue)

잘 된다!

댓글남기기