파이썬 백준 2630번
실버2
https://www.acmicpc.net/problem/2630
문제 보기
문제 풀기
2차 array 형태로 모든 색종이의 맵을 저장하고 이중 for loop 를 통해 왼쪽 위 구석에서 부터 차례대로 color_check != colorpaper_ls[i][j]: 체크해 나간다. 이 때, 기준이 되는 원소는 맨 처음에 시작하는 왼쪽 위이며, 흰색 또는 파란색과 같은지를 계속 비교해 나간다. 모든 원소에 대해 첫 colorpaper_ls[x][y] 와 값이 같으면, 그것이 흰색이면 white_count += 1, 또는 그것이 파란색이면 blue_count += 1 를 누적해 나간다.
하지만, for loop 을 도는 도중 if color_check != colorpaper_ls[i][j]: 조건을 만족하여 첫 원소와 같지 않은 경우가 발생하게 되면 가로 세로 절반을 나누어 1사분면, 2사분면, 3사분면, 그리고 4사분면에 해당하는 N//2 으로 다시 함수에 적용하여 작업을 수행하고 return 으로 빠져 나온다. 같은 색으로 정사각형이 모두 이루어질때까지 재귀함수는 돌아간다.
주어진 맵의 형태를 두고 모든것을 스캔하여 푸는 것에 대해 개인적으로 아직 방법 확립이 안된것 같다.
코드 보기
import sys
inputdata = sys.stdin.readline
def fnCutColorpaper (x, y, N):
global white_count, blue_count
color_check = colorpaper_ls[x][y]
for i in range(x, x + N):
for j in range(y, y + N):
if color_check != colorpaper_ls[i][j]:
fnCutColorpaper(x, y, N//2)
fnCutColorpaper(x, y + N//2, N//2)
fnCutColorpaper(x + N//2, y, N // 2)
fnCutColorpaper(x + N//2, y + N//2, N // 2)
return
if color_check == 0:
white_count += 1
if color_check == 1:
blue_count += 1
if __name__ == "__main__":
N = int(inputdata().strip())
colorpaper_ls = [list(map(int, inputdata().split())) for _ in range(N)]
white_count, blue_count = 0, 0
# print(colorpaper_ls) #
fnCutColorpaper(0, 0, N)
print(white_count)
print(blue_count)
'공부하기 > 백준' 카테고리의 다른 글
[Python] 백준 풀기 1920 - 수 찾기 (0) | 2022.10.11 |
---|---|
[Python] 백준 풀기 1992 - 쿼드트리 (2) | 2022.10.11 |
[Python] 백준 풀기 1541 - 잃어버린 괄호 (0) | 2022.10.09 |
[Python] 백준 풀기 1931 - 회의실 배정 (0) | 2022.10.07 |
[Python] 백준 풀기 11047 - 동전 0 (0) | 2022.10.06 |