레벨업 일지

[Java] 백준 17829 222-풀링 본문

알고리즘/백준

[Java] 백준 17829 222-풀링

24시간이모자란 2023. 7. 4. 02:48

문제

17829번: 222-풀링 (acmicpc.net)

 

17829번: 222-풀링

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

www.acmicpc.net

재귀를 사용해서 문제 풀이를 구현할 줄 아는지 묻는 문제.

풀이

이미지 압축일종인 CNN 풀링중 222-풀링은 4 개의 원소 중 2번째로 큰 원소를 찾는다.

stride 기법으로 , 배열 원소 4개씩 살펴 본 뒤, 2번째로 큰 원소를 k번째 칸에 삽입한다.

 

풀이는 다음과 같다.

  1. 현재 size 를 파라미터로 담아 재귀 호출을 한다. 1이 되면 종료한다.
  2. 각 단계마다 4개의 원소를 리스트에 담아 정렬한다.
  3. 4개중 2번째로 큰 원소니깐, 정렬된 리스트의 3번째 값을 저장한다.
  4. 재귀 호출을 불러. 1번 알고리즘으로 돌아간다.
  5. 정답을 리턴한다.

 

코드

 

import java.io.*;
import java.lang.reflect.Array;
import java.util.*;
public class Main {

    int arr[][];

    ArrayList<Integer> l;
    public static void main(String[] args) throws IOException {
        Main m = new Main();
        m.solution();
    }
    public void solution() throws IOException {
        FastReader fr = new FastReader();
        int N = fr.nextInt();
        arr = new int[N][N];
        l = new ArrayList<>();
        for(int i =0 ;i < N ;i++){
            for(int j= 0 ; j< N ;j++){
                arr[i][j] = fr.nextInt();
            }
        }
        pooling2By2(N);
        System.out.println(arr[0][0]);

    }
    public void pooling2By2(int N){
        if(N == 1)return;
        int a;
        int b;
        int stride =0;
        
        for(int i =0 ; i< N ;i+=2){
            for(int j =0 ;j < N ;j+=2){
                l.removeAll(l);
                l.add(arr[i][j]);
                l.add(arr[i+1][j]);
                l.add(arr[i+1][j+1]);
                l.add(arr[i][j+1]);
                Collections.sort(l);
               arr[stride/(N/2)][stride%(N/2)] = l.get(2);
                //System.out.println(l+", "+l.get(2));
                //System.out.println(stride/(N/2)+","+stride%(N/2));
                stride++;
            }
        }
        pooling2By2(N/2);
    }


    public static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        public FastReader(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(new File(s)));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[Java] 백준 18222 투에-모스 문자열  (0) 2023.07.05
[Java] 백준 1074 Z  (0) 2023.07.04
[Java] 백준 16935 배열 돌리기 3  (0) 2023.06.29
[Java] 백준 10799 쇠막대기  (0) 2023.06.29
[Java] 백준 5464.주차장  (0) 2023.06.27
Comments