-

[BOJ - JAVA] 1895 - 필터(슬라이딩 윈도우) 본문

백준 문제 풀이

[BOJ - JAVA] 1895 - 필터(슬라이딩 윈도우)

흣차 2021. 10. 18. 00:02
728x90
반응형

# 주소

https://www.acmicpc.net/problem/1895

 

1895번: 필터

숫자 9개가 오름차순이나 내림차순으로 정렬되어 있을 때, 중앙값은 다섯 번째 숫자이다. 예를 들어, 1, 3, 4, 1, 2, 6, 8, 4, 10의 중앙값은 4이다. (1 ≤ 1 ≤ 2 ≤ 3 ≤ 4 ≤ 4 ≤ 6 ≤ 8 ≤ 10) 이미지 I는

www.acmicpc.net

 

# 문제

 

# 문제 해설 및 코드리뷰

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int m = scan.nextInt();
        int[] dp = new int[9];
        int[][] arr = new int[n][m];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                arr[i][j] = scan.nextInt();
            }
        }
        int x = scan.nextInt();
        int g = (n-2) * (m-2);
        int[] ans = new int[g];
        int count = 0;
        int sh = 0;
        for(int i = 0; i < n-2; i++){
            count = 0;
            for(int j = 0; j < m-2; j++){
                dp[count] = arr[i][j];
                dp[count+1] = arr[i][j+1];
                dp[count+2] = arr[i][j+2];
                dp[count+3] = arr[i+1][j];
                dp[count+4] = arr[i+1][j+1];
                dp[count+5] = arr[i+1][j+2];
                dp[count+6] = arr[i+2][j];
                dp[count+7] = arr[i+2][j+1];
                dp[count+8] = arr[i+2][j+2];
                Arrays.sort(dp);
                ans[sh] = dp[4];
                sh++;
            }
        }
        int a = 0;
        for(int i = 0; i < sh; i++){
            if(ans[i] >= x)
                a++;
        }
        System.out.println(a);
            
    }
}

dp함수에 arr를 while이나 for문 써서 넣으면 되는데 뭐에 씌였는지 count 부터 count + 8 까지 다 넣었습니다.

절대 좋은 코딩은 아닙니다. ㅋㅋㅋ i랑 j생각해주면서 dp에 넣는게 귀찮기도 하고 9개의 값만 넣으면 되니 그냥 노가다로 했는데 여러분들은 꼭 한 번 생각해보셨음 좋겠습니다.

이게 인공지능을 조금 배우신 분이라면 이 과정이 '데이터 전처리'임을 알 수 있으실텐데요.

보통 padding까지 넣고 데이터 필터링을 거쳐서 3x3의 필터로 각 값의 최대값을 구하는 것이 일반적인 머신러닝의 기법입니다. 여기서는 중앙값을 구해서 풀이를 하였지만 실제로는 최대값을 주로 쓰는 것을 볼 수 있을거에요. 처음엔 중앙값을 쓰는게 더 정확할거같은데 왜 최댓값을 쓰는지 궁금했었는데, 이미지를 처리하는 전처리과정에서는 최대값을 쓰는 것이 더 정확도가 높다는 얘기를 들은 것 같네요. 요즘은 SW개발자를 준비하고 있어서 기억은 잘 안나지만요.

본론으로 돌아가, dp를 입력 받고 그것들을 정렬시킵니다.

그리고 중앙값을 찾는 것이므로 dp의 5번째 값(dp[4])를 ans에 각각 저장합니다. 이 때 ans배열의 크기는 n-2 * m-2인데 이유는, 3x3의 필터로 전처리를 거치게 되면 남는 행과 열의 크기는 2만큼 작아진 크기이기 때문입니다!!

그래서 ans에 값을 다 넣은 후 x이상의 값의 개수를 출력해주시면 원하는 출력값을 얻을 수 있습니다.

싸피에 나오는 CT 문제 중 하나라서 코딩으로 풀어봤습니다.

감사합니다! 

 

728x90
반응형
Comments