프로그래밍/백준풀이
색종이 만들기 파이썬
아싸호랑나비
2022. 10. 6. 06:31
https://www.acmicpc.net/problem/2630
그동안 백준을 너무 멀리했다
분할정복의 첫번째 문제다
나는 분할정복이 정확히 무엇을 의미하는지 잘 모른다
그러나 이 색종이 만들기라는 문제 일단 분할정복이 뭔지몰라도
적어도 접근조차는 할수있는 문제라는 생각이든다
먼저 문제에서 소개한방식으로 구현을 할경우
해당영역이 모두 0또는 1인지검사 => 모두 같은색으로 칠해져있는경우 유지 아니면 영역 4분할인데
이경우 계속 검사하게되는 부분이 생긴다 모두 같은 수로 차있는지 말이다
하지만 이방법말고 다른방법이 지금 내 졸린뇌에서 떠오르지가 않는다
일단 이방법으로 구현해보고
시간초과가 나면 다른방법을 생각해보자
-------------------221008--------------
결론부터 말하자면 첫번째 제출에 통과했다
다른사람들이 작성한 코드와의 실행속도를 비교해보았을때 빠르다고 볼수없는 속도인것을 확인했다
재귀함수를 이용해 풀었다
색깔이 통일되어있지않다면 색깔이 통일된 사각형이 나올때까지 4등분을 한다
어려운문제인줄알았는데 너무쉽게 풀어버린것같다
아래는 코드다
white=0
blue=0
la=[]
for i in range(int(input())):
a=list(map(int,input().split()))
la.append(a)
def sje(paper):
global white
global blue
fc=paper[0][0]
lena=len(paper)
cnt=0
for i in range(lena):
for j in range(lena):
if paper[i][j]!=fc:
cnt+=1
break
if cnt!=0:
break
if cnt==0:
if fc==0:
white+=1
else:
blue+=1
else:
la2=[]
for i in range(lena//2):
la2.append(paper[i][:lena//2])
la3=[]
for i in range(lena//2):
la3.append(paper[i][lena//2:])
la4=[]
for i in range(lena//2,lena):
la4.append(paper[i][:lena//2])
la5=[]
for i in range(lena//2,lena):
la5.append(paper[i][lena//2:])
sje(la2)
sje(la3)
sje(la4)
sje(la5)
sje(la)
print(white)
print(blue)