문제
문제
조기 졸업을 꿈꾸는 종욱이는 요즘 핫한 딥러닝을 공부하던 중, 이미지 처리에 흔히 쓰이는 합성곱 신경망(Convolutional Neural Network, CNN)의 풀링 연산에 영감을 받아 자신만의 풀링을 만들고 이를 222-풀링이라 부르기로 했다.다음은 8×8 행렬이 주어졌다고 가정했을 때 222-풀링을 1회 적용하는 과정을 설명한 것이다
행렬을 2×2 정사각형으로 나눈다.
각 정사각형에서 2번째로 큰 수만 남긴다. 여기서 2번째로 큰 수란, 정사각형의 네 원소를 크기순으로 a4 ≤ a3 ≤ a2 ≤ a1 라 했을 때, 원소 a2를 뜻한다.
2번 과정에 의해 행렬의 크기가 줄어들게 된다.종욱이는 N×N 행렬에 222-풀링을 반복해서 적용하여 크기를 1×1로 만들었을 때 어떤 값이 남아있을지 궁금해한다.랩실 활동에 치여 삶이 사라진 종욱이를 애도하며 종욱이의 궁금증을 대신 해결해주자.
입력
첫째 줄에 N(2 ≤ N ≤ 1024)이 주어진다. N은 항상 2의 거듭제곱 꼴이다. (N=2K, 1 ≤ K ≤ 10)다음 N개의 줄마다 각 행의 원소 N개가 차례대로 주어진다. 행렬의 모든 성분은 -10,000 이상 10,000 이하의 정수이다.
출력
마지막에 남은 수를 출력한다.
문제 풀이
백준문제에서 몇 없는 매우 친절한 문제이다. 해당 문제에서는 분할하다가 분할된 사이즈가 2 * 2가 되었을 때 해당 배열에서 가장 작은 값들을 다시 반환해야 하는 문제이다.
나의 답안
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
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) {
int[] arr = new int[4];
if (size == 2) {
int idx = 0;
for (int a = i; a < i + 2; a++) {
for (int b = j; b < j + 2; b++) {
arr[idx++] = matrix[a][b];
}
}
Arrays.sort(arr);
return arr[2];
}
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];
}
}
'BackJoon > Algorithm' 카테고리의 다른 글
(1932) 정수 삼각형 (0) | 2023.04.09 |
---|---|
(2630) 색종이 만들기 (0) | 2023.04.09 |
(1992) 쿼드트리 (0) | 2023.04.09 |
(1780) 종이의 개수 (0) | 2023.04.09 |
(2775) 부녀회장이 될테야 (0) | 2023.04.08 |