본문 바로가기

카테고리 없음

[c++][백준 21938][bfs] 영상 처리 - 컴도리돌이

728x90
728x90

 

21938번: 영상처리

화면의 세로 $N$, 가로 $M$ 값이 공백으로 구분되어 주어진다. 두 번째 줄부터 $N + 1$줄까지 $i$번째 가로를 구성하고 있는 픽셀의 $R_{i,j}$, $G_{i,j}$, $B_{i,j}$의 값이 공백으로 구분되어 총 $M$개 주어진

www.acmicpc.net


풀이 과정

 

해당 문제는 bfs로 문제를 해결할려고 결정하였고, 정말 쉽게 풀었다. 하지만 결과는 실패.. 정말 맞왜틀.. 처음에는 내 로직이 틀린 줄 알았다. 그래서 다른 사람 코드를 보고 참고했는데 좀 더 간단하게 구현했을 뿐이지 별 차이가 없는 정말 쉬운 문제였는데,,, 그래서 반환 값 문제인가 해서 long long으로도 바꿔보고 double형으로도 바꿔봤지만 계속 실패만 하였다. 그래서 차근차근 input함수부터 읽어내렸는데,,, 

2차원 배열에 RGB 값을 더해서 3으로 나눈 값을 넣는 과정에서 RGB 값을 더하지 않고 RGN을 더해버렸다.;; 하.. 다음부터는 오타가 있는지 먼저 확인을 해야겠다.. 


#include<iostream>
#include<vector>
#include<queue>

using namespace std;

int n,m,t,answer=0;

vector<vector<int>> monitor;
vector<pair<int,int>> v;

int dx[] = {0,-1,0,1};
int dy[] = {1,0,-1,0};

void input(){
    ios_base::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin >> n >> m;

    monitor.resize(n,vector<int>(m));

    for(int i=0; i< n;i++){
        for(int j=0,r,g,b; j<m; j++){
            cin >> r >> g >> b;

            monitor[i][j] = (r+g+b)/3;
        }
    }
    cin >> t;
}

void transform(){
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(monitor[i][j] < t) monitor[i][j] = 0;
            else {
                monitor[i][j] = 255;
                v.push_back({i,j});
            }
        }
    }
}

void objectCount(){

    if(v.empty()){
        cout << 0;
        return;
    }
    vector<vector<bool>> visited(n,vector<bool>(m));
    for(auto vv : v){
        if(visited[vv.first][vv.second]) continue;
        visited[vv.first][vv.second] = true;
        queue<pair<int,int>> q;
        q.push({vv.first,vv.second});

        while(!q.empty()){
            int x = q.front().first;
            int y = q.front().second;
            q.pop();

            for(int i=0; i<4; i++){
                int nx = x + dx[i];
                int ny = y + dy[i];

                if(nx <0 or ny < 0 or nx >=n or ny >= m) continue;
                if(visited[nx][ny] or !monitor[nx][ny]) continue;
                visited[nx][ny] = true;
                q.push({nx,ny});
            }
        }
        answer++;
    }
    cout << answer;
}

void solution(){
    input();
    transform();
    objectCount();
}
int main(){
    solution();
    return 0;
}

분발하자..

728x90
728x90