해답)
import sys
def input():
return sys.stdin.readline()
N = int(input())
board = []
for _ in range(N):
board.append(list(input()))
def isAllSame(s_r, s_c, n):
chk = board[s_r][s_c]
for i in range(n):
for j in range(n):
if board[s_r+i][s_c+j] != chk:
return False
return True
def do(s_r, s_c, n):
if n == 1:
return board[s_r][s_c]
if isAllSame(s_r,s_c, n):
return board[s_r][s_c]
l_u = str(do(s_r, s_c, n//2))
l_d = str(do(s_r + n//2, s_c, n//2))
r_u = str(do(s_r, s_c + n//2, n//2))
r_d = str(do(s_r + n//2, s_c + n//2, n//2))
return "(" + str(l_u) + str(r_u) + str(l_d) + str(r_d) + ")"
print(do(0,0,N))
풀이)
전형적인 분할정복의 문제입니다.
1. 타일이 한 종류의 색깔로 돼있는지 검사합니다.
1-1. 만약 한 종류거나, 변의 길이가 1이라면, 그대로 리턴합니다.
1-2. 만약 한 종류가 아니라면, 4등분을 해서 재귀적으로 실행시키고, 가로안에 4부분을 각각 출력해줍니다.
* 분할하고 합칠 때, 순서에 유념해야 합니다.
* 위 문제의 저작권은 백준(https://www.acmicpc.net/) 에 있습니다.
728x90
'문제풀이 > 백준' 카테고리의 다른 글
[백준✨] 11779번 <최소비용 구하기2> / Python 문제풀이 / 다익스트라 (0) | 2020.11.10 |
---|---|
[백준✨] 9205번 <맥주 마시며 걸어가기> / Python 문제풀이 / (0) | 2020.11.03 |
[백준✨] 1780번 <종이의 개수> / Python 문제풀이 (0) | 2020.10.02 |
[백준✨] 10825번 <국영수> / Python 문제풀이 (0) | 2020.09.22 |
[백준✨] 1106번 <제곱ㄴㄴ수> / Python 문제풀이 (0) | 2020.09.15 |
댓글