Koala - 16기/코딩테스트 심화 스터디

[백준/C++] 1895번: 필터

.우디. 2024. 9. 29. 16:23

문제&링크

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

 

풀이

1. 전체 이미지를 확인해야 하기에 완전 탐색을 사용한다.

2. 필터의 크기가 3 x 3이기에 필터의 사각형의 왼쪽 위를 기준으로 두고 반복문을 사용한다. 즉 R과 C의 크기 -2까지 반복문 사용한다.

3. 해당 필터 내에 있는 모든 값을 벡터 V에 삽입한다.

4. 필터에 대한 반복문이 끝날 때 벡터 V를 오름차순으로 sort하고, 중간 값인 네 번째 인덱스를 벡터 ans에 삽입한다.

5. 이미지의 모든 부분에 대해 필터를 씌우고 난 후 모아진 벡터 ans에 대해서 입력한 값 T보다 큰지 작은지 판단 후 정답인 cnt를 구한다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int img[41][41];
vector<int> ans;

int main() {
    int R, C;
    int T;
    cin >> R >> C;
    for (int i = 1; i <= R; i++) {
        for (int j = 1; j <= C; j++) {
            cin >> img[i][j];
        }
    }
    cin >> T;
    
    for (int i = 1; i <= R - 2; i++) {
        for (int j = 1; j <= C - 2; j++) {
            vector<int> V;
            for (int k = 0; k < 3; k++) {
                for (int l = 0; l < 3; l++) {
                    V.push_back(img[k + i][l + j]);
                    
                }
            }
            sort(V.begin(), V.end());
            ans.push_back(V[4]);            
        }
    }
    int cnt = 0;
    for (int i = 0; i < ans.size(); i++) {
        if (ans[i] >= T) cnt++;
    }
    
    cout << cnt;
}