728x90
🔗 Problem Link
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
❔Thinking
- 0과 1로 이루어진 정수 배열 arr을 작게 나누어, 나뉜 영역이 모두 0이거나 1이면 해당 수 하나로 압축한다.
- 나뉜 영역이 압축 불가하다면, 다시 작게 나누어 확인하는 과정을 반복한다.
- 압축 시행 후, 0과 1의 개수를 각각 세어 반환한다.
문제를 다음과 같이 생각할 수 있다.
크기가 $2^{n}$인 0 또는 1로만 이루어진 도장을 만들고, 이 도장과 모양이 같을 경우 판에 도장을 찍는다.
0의 도장과 1의 도장이 각각 찍힌 횟수 반환한다.
💻Solution
def QuadStamp(arr:list, N:int)->list:
result = [0,0]
for x in range(0, len(arr), N):
for y in range(0, len(arr[0]), N):
zero_stamp = True
one_stamp = True
for i in range(x, x+N):
for j in range(y, y+N):
if arr[i][j] != 0: zero_stamp = False
if arr[i][j] != 1: one_stamp = False
if zero_stamp is True or one_stamp is True:
for i in range(x, x+N):
for j in range(y, y+N):
arr[i][j] = '-'
result[0], result[1] = result[0]+zero_stamp, result[1]+one_stamp
return arr, result
def solution(arr):
answer = [0, 0]
# 0과 1개수 세기
for i in range(len(arr)):
for j in range(len(arr[0])):
if arr[i][j] == 0: answer[0] += 1
if arr[i][j] == 1: answer[1] += 1
# 스탬프 찍어보기
stamp_size = len(arr)
while stamp_size > 1:
arr, tmp = QuadStamp(arr, stamp_size)
answer[0] -= tmp[0] * (stamp_size**2 - 1)
answer[1] -= tmp[1] * (stamp_size**2 - 1)
stamp_size //= 2
return answer
🗝️keypoint
- 압축 시행 후 0과 1의 개수는, 전체 0과 1의 개수에서 압축이 가능한 경우를 뺀 값과 같다.
- 이미 압축이 이루어진 경우, 더 작은 단위의 도장으로 압축되지 않도록 제외시키는 알고리즘이 필수적이다.
- 큰 영역에서 작은 영역으로 압축 가능 여부를 확인해야 더 적은 반복으로 원하는 값을 얻을 수 있다.
'코딩테스트 > Python' 카테고리의 다른 글
[Programmers] Level 2. 삼각 달팽이 (Python) (0) | 2022.09.30 |
---|---|
[Programmers] Level 2. 짝지어 제거하기 (0) | 2022.09.29 |
[Programmers] Level 2. 2개 이하로 다른 비트 (0) | 2022.09.29 |
[Baekjoon] 1439번 - 뒤집기 (0) | 2022.09.27 |
[Programmers] Level 2. 모음사전 (0) | 2022.09.27 |