본문 바로가기
Algorithm/BFS DFS

[백준] 2667 단지번호붙이기 c++

by 젊은오리 2023. 2. 27.
728x90

 

문제링크 https://www.acmicpc.net/problem/2667

DFS와 BFS 둘다 이용해서 풀이했다.

DFS 주의사항

  • dfs재귀 함수를 호출할 때마다 count를 증가해선 안된다.--> dfs(nx,ny,count+1)이런식으로 매개변수로 넣으면 안된다는 뜻. 
  • 그 이유는, 일직선 상으로 생기지 않고 (ㅓ,ㅗ,ㅏ,ㅗ) <-이런 모양으로 생긴 동네의 경우 실제 집의 갯수보다 적게 호출되는 경우가 발생하기 때문.
  • 따라서 dfs로 탐색하다가 범위 내의 방문하지 않은 곳을 찾으면 곧바로 +1을 해주면 된다.

 

>DFS풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX = 26;
int n;
string arr[MAX];
bool visited[MAX][MAX];
int sum;
vector<int> answer; //정답 배열
int dir[4][2= { {-1,0},{1,0},{0,1},{0,-1} };
int dist; //인접한 집의 갯수
 
void dfs(int x, int y) {
    for (int i = 0; i < 4; i++) {
        int nx = x + dir[i][0];
        int ny = y + dir[i][1];
        if (visited[nx][ny])
            continue;
        if (nx < 0 || nx >= n || ny < 0 || ny >= n)
            continue;
        if (arr[nx][ny] == '0')
            continue;
        visited[nx][ny] = true;
        dist++;
        dfs(nx, ny);
    }
}
 
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if ((arr[i][j] == '1'&& !visited[i][j]) {
                dist = 1//첫 동네 +1
                visited[i][j] = true;
                dfs(i, j);
                answer.push_back(dist);
            }
        }
    }
 
    sort(answer.begin(), answer.end());
    cout << answer.size() << endl;
    for (auto i : answer)
        cout << i << endl;
 
}
 
cs

 

>BFS풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX = 26;
int n;
string arr[MAX];
bool visited[MAX][MAX];
vector<int> answer; //정답 배열
int dir[4][2= { {-1,0},{1,0},{0,1},{0,-1} };
int dist; //인접한 집의 갯수
 
void bfs(int x, int y) {
    dist++//첫 동네 +1을 해줌
    queue<pair<intint>> q;
    q.push({ x,y });
    while (!q.empty()) {
        int frontx = q.front().first;
        int fronty = q.front().second;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int nx = frontx + dir[i][0];
            int ny = fronty + dir[i][1];
            if (visited[nx][ny])
                continue;
            if (nx < 0 || nx >= n || ny < 0 || ny >= n)
                continue;
            if (arr[nx][ny] == '0')
                continue;
 
            visited[nx][ny] = true;
            q.push({ nx,ny });
            dist++;
        }
    }
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
    }
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if ((arr[i][j] == '1'&& !visited[i][j]) {
                visited[i][j] = true;
                dist = 0;
                bfs(i, j);
                answer.push_back(dist); 
            }
        }
    }
    sort(answer.begin(), answer.end());
    cout << answer.size() << endl;
    for (auto i : answer)
        cout << i << endl;
 
}
 
cs
728x90

'Algorithm > BFS DFS' 카테고리의 다른 글

[백준] 11724 연결 요소의 개수 c++  (0) 2023.02.28
[백준] 1012 유기농 배추 c++  (0) 2023.02.27
[프로그래머스] 가장 먼 노드 c++  (0) 2023.02.25
[백준] 1987 알파벳 c++  (0) 2023.02.24
[백준] 바이러스 c++  (0) 2023.02.23

댓글