2023. 9. 16. 13:50, 알고리즘/BOJ
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이 꺼꾸로인지, 그렇다면 그 원소로 주는 점들도 거꾸로인지 확실하게 확인하고 풀이하는 습관을 들이도록 하자.
'알고리즘 > BOJ' 카테고리의 다른 글
BOJ 7569 c++ 토마토 - tuple에서 개별 원소 접근은 get<index>(tuple_name) 을 이용. 혹은 tie를 사용하자. (0) | 2023.09.21 |
---|---|
BOJ 10026 c++ 적록색약 (0) | 2023.09.20 |
BOJ 7576 토마토 || 내 풀이와 거기에서 더 좋은 개선사항. (0) | 2023.09.16 |
boj 11003 최솟값 찾기 || deque를 이용한 풀이에 대해서. (0) | 2023.09.10 |
boj 5430 AC || parser를 어떻게 구현할 것인가가 핵심이다. (0) | 2023.09.09 |
Comments, Trackbacks