알고리즘

BOJ 1995: 필터 (C++)

namaskar 2025. 1. 12. 22:13

 

문제 요약

그렇게 어렵지는 않은 문제로 이미지 I가 주어졌을 때, 3*3 크기의 필터를 사용하여 이미지 전체를 훑고 지나가면서 중앙값을 저장한 더 작은 크기의 이미지를 만들면 된다. 

 

이미지 결과를 출력할필요는 없고, 그 개수만 출력하면 되기 때문에 굳이 2차원 배열에 이를 따로 저장할 필요는 없다.

 

 

코드 전문

#include <iostream>
#include <set>

using namespace std;

int main(int argc, const char * argv[]) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int R, C;
    cin >> R >> C; // 행과 열 입력
    
    int I[41][41];
    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cin >> I[i][j]; // 행렬 데이터 입력
        }
    }
    
    int T; // 기준 값 입력
    cin >> T;
    int temp = 0; // 조건을 만족하는 3x3 필터의 개수
    
    for (int i = 0; i <= R - 3; i++) { // 3x3 필터를 적용할 수 있는 행 범위
        for (int j = 0; j <= C - 3; j++) { // 3x3 필터를 적용할 수 있는 열 범위
            multiset<int> ms;
            
            // 3x3 필터의 모든 값을 멀티셋에 삽입
            for (int k = 0; k < 3; k++) {
                for (int l = 0; l < 3; l++) {
                    ms.insert(I[i + k][j + l]);
                }
            }
            
            // 멀티셋에서 중앙값 찾기 (5번째 요소: 0-based index 4)
            auto it = ms.begin();
            advance(it, 4); // 중앙값 위치로 이동
            
            // 중앙값이 T 이상인 경우 카운트 증가
            if (*it >= T) {
                temp++;
            }
        }
    }
    
    cout << temp << "\n"; // 조건을 만족하는 3x3 필터의 개수 출력
    
    return 0;
}

큰 의미 없지만 해당 코드에서는 정렬된 상태로 저장되는 Set 자료구조를 사용했다. 중복이 가능하기 때문에 멀티셋을 사용하여야 한다. 만약 벡터(배열)를 사용한다면, 그냥 9개의 값을 저장한 다음 정렬하고, 중앙값을 찾으면 된다. 

'알고리즘' 카테고리의 다른 글

BOJ 2240: 자두나무 (c++)  (0) 2025.03.30
BOJ 4963: 섬의 개수 (c++)  (0) 2025.02.16
BOJ 2467: 용액 (C++)  (0) 2025.01.26