BOJ 1012 유기농 배추 || x 좌표와 y 좌표의 꼬임을 매우매우 조심할것.

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

 

#include <bits/stdc++.h>
using namespace std;

int m, n, k;
int tc;

int board[55][55];
int vis[55][55];

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

int main(){
  ios::sync_with_stdio(0);
  cin.tie(0);
  
  cin>>tc;
  while(tc--){
    cin>>m>>n>>k;
    for(int i=0; i<n; i++){
      for(int j=0; j<m; j++){
        board[i][j]=0; // 초기화 || fill 함수 사용해도 됨
      }
    }
    for(int i=0; i<n; i++){ // vis배열 초기화
        for(int j=0; j<m; j++){
            vis[i][j]=0;
        }
    }
    while(k--){ //맵 입력
      int x,y;
      cin>>x>>y;
      board[y][x]=1; // <<== 바로 여기!!
    }
    
    queue<pair<int,int>> q;
    int ans=0;
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(vis[i][j]==1) continue;
            if(board[i][j]==0) continue;
            vis[i][j]=1;
            q.push({i,j});
            ans++;
            while(!q.empty()){
                auto cur=q.front(); q.pop();
                for(int dir=0; dir<4; dir++){
                    int nx=cur.first+dx[dir];
                    int ny=cur.second+dy[dir];
                    if(nx<0|| nx>=n||ny<0||ny>=m) continue;
                    if(vis[nx][ny]==1) continue;
                    if(board[nx][ny]==0) continue;
                    vis[nx][ny]=1;
                    q.push({nx,ny});
                }
            }
        }
    }
    cout<<ans<<'\n';
  }
}

처음에 문제에서 각각의 배추의 위치를 입력받을때 생각없이 x, y 니까 내가 생성한대로 x가 행, y가 열인 것으로 생각해서 받아서 바로 board[x][y]=1 형식으로 만들어서 제출했는데, 모든 부분들을 보아도 잘못될만한 부분이 없어서 어디를 잘못했을까 하고 뭔가 m, n 을 입력받는것이 꼬여있으니까 관련된 부분에서 잘못되었을거 같아서 찾아보니, 문제에서 x, y라고 주는것도 결국 m, n 으로 꼬여있는 상태로 주는 형태였다. 

그래서 그 부분을 입력받는 행과 열을 바꾸어서 입력하니까 정답처리 되었다. 

이렇듯 문제에서 정확히 읽고 입력받을때 m, n이 꺼꾸로인지, 그렇다면 그 원소로 주는 점들도 거꾸로인지 확실하게 확인하고 풀이하는 습관을 들이도록 하자. 

 

  Comments,     Trackbacks