17829번: 222-풀링
조기 졸업을 꿈꾸는 종욱이는 요즘 핫한 딥러닝을 공부하던 중, 이미지 처리에 흔히 쓰이는 합성곱 신경망(Convolutional Neural Network, CNN)의 풀링 연산에 영감을 받아 자신만의 풀링을 만들고 이를 22
www.acmicpc.net
문제
조기 졸업을 꿈꾸는 종욱이는 요즘 핫한 딥러닝을 공부하던 중, 이미지 처리에 흔히 쓰이는 합성곱 신경망(Convolutional Neural Network, CNN)의 풀링 연산에 영감을 받아 자신만의 풀링을 만들고 이를 222-풀링이라 부르기로 했다.
다음은 8×8 행렬이 주어졌다고 가정했을 때 222-풀링을 1회 적용하는 과정을 설명한 것이다
1. 행렬을 2×2 정사각형으로 나눈다.
2. 각 정사각형에서 2번째로 큰 수만 남긴다. 여기서 2번째로 큰 수란, 정사각형의 네 원소를 크기순으로 a4 ≤ a3 ≤ a2 ≤ a1 라 했을 때, 원소 a2를 뜻한다.
3. 2번 과정에 의해 행렬의 크기가 줄어들게 된다.
종욱이는 N×N 행렬에 222-풀링을 반복해서 적용하여 크기를 1×1로 만들었을 때 어떤 값이 남아있을지 궁금해한다.
랩실 활동에 치여 삶이 사라진 종욱이를 애도하며 종욱이의 궁금증을 대신 해결해주자.
입력
첫째 줄에 N(2 ≤ N ≤ 1024)이 주어진다. N은 항상 2의 거듭제곱 꼴이다. (N=2K, 1 ≤ K ≤ 10)
다음 N개의 줄마다 각 행의 원소 N개가 차례대로 주어진다. 행렬의 모든 성분은 -10,000 이상 10,000 이하의 정수이다.
출력
마지막에 남은 수를 출력한다.
코드
import sys, heapq
input = sys.stdin.readline
from collections import deque
n = int(input())
arr = [list(map(int, input().split())) for _ in range(n)]
def pooling(n):
if n == 1:
print(arr[0][0])
return
deq = deque()
for i in range(0, n, 2):
for j in range(0, n, 2):
# 2X2 정사각형에서 2번째로 큰 수 찾기
heap = []
for p in range(i, i+2):
for q in range(j, j+2):
heapq.heappush(heap, -arr[p][q])
heapq.heappop(heap)
deq.append(-heapq.heappop(heap)) # 2번째로 큰 수 deq에 append
# 2번째로 큰 수들 arr에 갱신
for i in range(n//2):
for j in range(n//2):
arr[i][j] = deq.popleft()
pooling(n//2)
pooling(n)
'문제풀이 > 분할정복' 카테고리의 다른 글
[Python/파이썬] 백준 2447번 별 찍기 - 10 (0) | 2023.05.07 |
---|---|
[Python/파이썬] 백준 1074번 Z (0) | 2023.03.15 |
[Python/파이썬] 백준 1992번 쿼드트리 (0) | 2023.03.15 |
[Python/파이썬] 백준 18222번 투에-모스 문자열 (0) | 2023.03.15 |
[Python/파이썬] 백준 2630번 색종이 만들기 (0) | 2023.03.14 |