Koala - 7기/코딩테스트 준비 스터디

[백준 / c++] 1895번 필터

HEE JIN 2022. 7. 17. 19:48

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

 

문제 분석

RxC 크기인 이미지 배열(=I)를 입력 받고, 3x3 배열의 필터를 씌여서 중앙값을 찾는 문제이다.

필 터를 씌어서 찾은 중앙값들을 정렬한 뒤, T 값 보다 큰 숫자들의 개수를 새는 문제이다. 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int I[45][45];
int abc(int yy, int xx)
{
    vector<int>v2;
    for(int y=0; y<=2; y++)
    {
        for(int x=0; x<=2; x++)
        {
            v2.push_back(I[yy+y][xx+x]);
        }
    }
 
    sort(v2.begin(),v2.end());
    return v2[4];
}
int main()
{
    int R,C,T;
    cin >> R >> C;
    
    for(int y=0; y < R; y++)
    {
        for(int x=0; x < C; x++)
        {
            cin >> I[y][x];
        }
    }
 
    cin>>T;
    int cnt=0;
 
    vector<int>v;
    for(int y=0; y < R - 2; y++)
    {
        for(int x=0; x < C - 2; x++)
        {
            int ret=abc(y,x);
            cnt+=(ret>=T);
        }
    }
 
    cout << cnt;
 
    return 0;
}
cs

 

문제 풀이

1. 배열 I를 위해, R,C 그리고 I를 입력 받는다 .

2. 기준 값 T를 입력받고, T보다 큰 값의 개수를 새기 위해 cnt를 정의해 준다. 

3. 3x3 필터를 씌워서 abc()함수로 보낸다. abc함수에서는 필터 속 중앙값을 반환해 주며, 그 값이 T 보다 클 경우 cnt에 더해준다. 

3-1. abc() 함수에, 필터의 첫범위인 y값과 x값을 넘겨준다. 그 다음 3x3 크기의 2중 for문을 돌려 v2에 push_back() 해준다.  9개를 다 넣은 후, 오름차순으로 정렬해 준 뒤, 중앙값인 v2[4]를 반환 해준다.