[Programmers] Level 2. 쿼드압축 후 개수 세기

2022. 9. 29. 16:26·코딩테스트/Python
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

  1. 압축 시행 후 0과 1의 개수는, 전체 0과 1의 개수에서 압축이 가능한 경우를 뺀 값과 같다.
  2. 이미 압축이 이루어진 경우, 더 작은 단위의 도장으로 압축되지 않도록 제외시키는 알고리즘이 필수적이다.
  3. 큰 영역에서 작은 영역으로 압축 가능 여부를 확인해야 더 적은 반복으로 원하는 값을 얻을 수 있다.

'코딩테스트 > 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
'코딩테스트/Python' 카테고리의 다른 글
  • [Programmers] Level 2. 삼각 달팽이 (Python)
  • [Programmers] Level 2. 짝지어 제거하기
  • [Programmers] Level 2. 2개 이하로 다른 비트
  • [Baekjoon] 1439번 - 뒤집기
swwho
swwho
일상을 데이터화하다
  • swwho
    하루한장
    swwho
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • ML_DL (39)
        • MUJAKJUNG (무작정 시리즈) (18)
        • 딥러닝 공부하기 (21)
      • 데이터사이언스 (1)
        • EDA (1)
        • 데이터과학을 위한 통계 (0)
      • 데이터엔지니어링 (2)
      • 논문리뷰 (2)
        • Computer Vision (2)
      • Python 활용하기 (12)
      • 코딩테스트 (127)
        • Python (109)
        • MySQL (14)
      • Git (3)
      • MySQL 활용하기 (0)
      • 일상 이야기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
swwho
[Programmers] Level 2. 쿼드압축 후 개수 세기
상단으로

티스토리툴바