알고리즘/백준 문제풀이
[백준] 2630번 : 색종이 만들기 (python 파이썬)
매일_공부
2024. 4. 18. 19:03
반응형
https://www.acmicpc.net/problem/2630
아주 깔끔한 문제인 거 같다.
문제를 읽고 직관적으로 바로 이해되는 문제가 나는 가장 좋은 문제라고 생각한다.
이 문제는 저번에 포스팅했었던 1074번 Z 문제와 흡사하다.
https://mail-study.tistory.com/12
문제를 보면 직관적으로 알 수 있을 것이다.
일단 색종이를 확인해서 모든 부분이 1 또는 0인지 확인한다.
만약 1과 0이 모두 있다면
4등분한다
그리고 각각의 부분에서 다시 반복한다.
이런 단순한 작업의 반복이기 때문에 구현이 간단할 것이다.
import sys
def l_sum(l): #리스트의 합 구하는 함수
ans = 0
for i in l:
for j in i:
ans = ans + j
return ans
def list_chunk(lst, n): #리스트를 쪼개 2차로 만드는 기능
return [lst[i:i+n] for i in range(0, len(lst), n)]
def func(l,n):
global blue
global white
if l_sum(l) == n**2:
blue = blue+1
elif l_sum(l) == 0:
white = white+1
else:
first_l = []
second_l = []
third_l = []
forth_l = []
for i in range(n):
for j in range(n):
if i < n//2 and j < n//2: # 1사분면
first_l.append(l[i][j])
elif i < n//2 and j >= n//2: #2사분면
second_l.append(l[i][j])
elif i >= n//2 and j < n//2: #3사분면
third_l.append(l[i][j])
elif i >= n//2 and j >= n//2:#4사분면
forth_l.append(l[i][j])
#일차리스트를 n//2 줄로 나누어야 하기에 함수를 사용한다.
func(list_chunk(first_l , n//2) , n//2)
func(list_chunk(second_l , n//2) , n//2)
func(list_chunk(third_l, n//2) , n//2)
func(list_chunk(forth_l , n//2) , n//2)
n = int(sys.stdin.readline())
blue =0
white = 0
l = []
for i in range(n):
l2 = list(map(int, sys.stdin.readline().split(" ")))
l.append(l2)
func(l,n)
print(white)
print(blue)
약간의 팁이라면
이 문제를 풀기 위해 필요한 기능은 다음과 같다.
1. 색종이의 합을 구하는 기능
2. 색종이를 4등분 하는 기능
이 두 부분을 잘 구현해야한다.
하지만 나도 그렇듯이 실력이 좋지 않아 구현에 문제가 어려우면
함수화해서 테스트와 보기에 깔끔하게 정리하는 장점을 챙겨보자!
반응형