[Java] 백준 / 222-풀링 / 17829번

정현명·2022년 2월 16일
0

baekjoon

목록 보기
58/180

[Java] 백준 / 222-풀링 / 17829번

문제

222-풀링 문제 링크

조기 졸업을 꿈꾸는 종욱이는 요즘 핫한 딥러닝을 공부하던 중, 이미지 처리에 흔히 쓰이는 합성곱 신경망(Convolutional Neural Network, CNN)의 풀링 연산에 영감을 받아 자신만의 풀링을 만들고 이를 222-풀링이라 부르기로 했다.

다음은 8×8 행렬이 주어졌다고 가정했을 때 222-풀링을 1회 적용하는 과정을 설명한 것이다

  1. 행렬을 2×2 정사각형으로 나눈다.

  1. 각 정사각형에서 2번째로 큰 수만 남긴다. 여기서 2번째로 큰 수란, 정사각형의 네 원소를 크기순으로 a4 ≤ a3 ≤ a2 ≤ a1 라 했을 때, 원소 a2를 뜻한다.

  1. 2번 과정에 의해 행렬의 크기가 줄어들게 된다.

종욱이는 N×N 행렬에 222-풀링을 반복해서 적용하여 크기를 1×1로 만들었을 때 어떤 값이 남아있을지 궁금해한다.

랩실 활동에 치여 삶이 사라진 종욱이를 애도하며 종욱이의 궁금증을 대신 해결해주자.



입력

첫째 줄에 N(2 ≤ N ≤ 1024)이 주어진다. N은 항상 2의 거듭제곱 꼴이다. (N=2K, 1 ≤ K ≤ 10)

다음 N개의 줄마다 각 행의 원소 N개가 차례대로 주어진다. 행렬의 모든 성분은 -10,000 이상 10,000 이하의 정수이다.

4
-6 -8 7 -4
-5 -5 14 11
11 11 -1 -1
4 9 -2 -4


출력

마지막에 남은 수를 출력한다.

11


접근 방식

재귀로 분할하여 해결한다

  1. 재귀함수 내에는 사각형이 2*2일 때랑 아닐 때로 나눈다
  2. 사각형이 2*2일 때는 해당 사각형의 모든 값을 정렬하여 그 중 2번째로 큰 수를 반환한다
  3. 사각형이 2*2가 아닐 때는 4부분으로 분할하여 다시 함수를 부르고 해당 함수가 반환한 값 중 2번째로 큰 수를 반환한다


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main_S2_17829 {

	static int[][] matrix;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		
		matrix = new int[N][N];
		
		for(int i=0;i<N;i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j=0;j<N;j++) {
				matrix[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		System.out.println(recur(0,0,N));
		
	}
	
	public static int recur(int i, int j, int size) {
		
		if(size == 2) {
			int arr[] = new int[4];
			int idx = 0;
			for(int r=i;r<i+2;r++) {
				for(int c=j;c<j+2;c++) {
					arr[idx++] = matrix[r][c];
				}
				
			}
			
			Arrays.sort(arr);
			return arr[2];
		}
		else {
			int arr[] = new int[4];
			size = size/2;
			
			arr[0] = recur(i,j,size);
			arr[1] = recur(i,j+size,size);
			arr[2] = recur(i+size,j,size);
			arr[3] = recur(i+size,j+size,size);
			
			Arrays.sort(arr);
			return arr[2];
			
		}
	}

}

0개의 댓글