티스토리 뷰

알고리즘

87. 섬나라 아일랜드 [BFS]

홍복치 2021. 3. 12. 13:01

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

 

풀이 

- queue를 이용한 BFS 문제

- 좌표 => Struct를 사용해 저장한다.

- 상하좌우대각선 => dx, dy 활용해 좌표를 먼저 구한후 배열에 대입한다.

- 섬을 발견하면 일단 큐에 넣고 그 섬의 위치는 0으로 만든다. 

- 그 섬과 연결된 섬을 찾기 위해 상하좌우대각선의 좌표들을 탐색해 큐에 넣는다. 큐에 넣은 후에는 그 위치에 0을 항상 표시해준다.

- 큐가 비면 연결된 하나의 섬을 찾았다는 것이고  카운트가 하나 증가한다.

 

#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
int n, map[30][30], cnt=0;
int dx[8]={0, 1, 1, 1, 0, -1, -1, -1};
int dy[8]={-1, -1, 0, 1, 1, 1, 0, -1};
//86. 섬나라 아일랜드(BFS)

struct Loc{
    int x;
    int y;
    Loc(int a, int b){
        x=a;
        y=b;
    }
};
queue<Loc> Q;

int main(){
    int i, j;
    scanf("%d", &n);
    for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d", &map[i][j]);
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            if(map[i][j]==1){
                Q.push(Loc(i,j));
                map[i][j]=0;
                while(!Q.empty()){
                    Loc tmp=Q.front();
                    Q.pop();
                    for(int i=0;i<8;i++){
                        int xx=tmp.x+dx[i];
                        int yy=tmp.y+dy[i];
                        if(map[xx][yy]==1){
                            Q.push(Loc(xx, yy));
                            map[xx][yy]=0;
                        }
                    }
                }
                cnt++;
            }
        }
    }
    printf("%d\n", cnt);
    return 0;
}

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

89. 토마토 [BFS]  (0) 2021.03.22
88. 미로의 최단거리 [BFS]  (0) 2021.03.17
86. 피자배달 거리 [DFS]  (0) 2021.03.10
조합 [DFS]  (0) 2021.03.08
85. 수식 만들기 [DFS]  (0) 2021.03.05
최근에 올라온 글
Total
Today
Yesterday