-
[BOJ - JAVA] 1895 - 필터(슬라이딩 윈도우) 본문
# 주소
https://www.acmicpc.net/problem/1895
# 문제
# 문제 해설 및 코드리뷰
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 문제 중 하나라서 코딩으로 풀어봤습니다.
감사합니다!
'백준 문제 풀이' 카테고리의 다른 글
[BOJ - JAVA] 2579 - 계단 오르기(DP, 점화식) (0) | 2021.10.20 |
---|---|
[BOJ - JAVA] 1912 - 연속합(DP) (0) | 2021.10.18 |
[BOJ - JAVA] 10870 - 피보나치 수열 5(DP) (0) | 2021.10.17 |
[BOJ - JAVA] 1365 - 꼬인 전깃줄(이분탐색, 가장 긴 증가하는 부분수열) (0) | 2021.10.15 |
[BOJ - JAVA] 12015 - 가장 긴 증가하는 부분 수열2(이분 탐색) (0) | 2021.10.15 |