Game Develop

[Algorithm]Baekjoon 2667번 : 단지번호붙이기 본문

Algorithm/Baekjoon

[Algorithm]Baekjoon 2667번 : 단지번호붙이기

MaxLevel 2022. 8. 8. 22:53

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

 

 

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using namespace std;
 
 
struct Node
{
    int y;
    int x;
    Node(int _y, int _x) : y(_y), x(_x) {};
};
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int map[26][26= { 0 };
 
    int length = 0;
    string row;
 
    // 우 하 좌 상
 
    vector<vector<int>> dir = { {0,1}, {1,0}, {0,-1}, {-1,0} };
 
    cin >> length;
 
    for (int i = 0; i < length; i++)
    {
        cin >> row;
 
        for (int j = 0; j < length; j++)
        {
            if (row[j] == '1') map[i][j] = 1;
        }
    }
 
 
    // BFS
    vector<int> answer;
 
    for (int row = 0; row < length; row++)
    {
        for (int col = 0; col < length; col++)
        {
            if (map[row][col] == 0continue;
 
            queue<Node> q;
            q.push(Node(row, col));
            map[row][col] = 0;
            int count = 1;
 
            while (!q.empty())
            {
                Node curNode = q.front();
                q.pop();
 
                int curNodeY = curNode.y;
                int curNodeX = curNode.x;
 
                for (int i = 0; i < dir.size(); i++// 우 하 좌 상
                {
                    int nextNodeY = curNodeY + dir[i][0];
                    int nextNodeX = curNodeX + dir[i][1];
 
                    if (nextNodeY < 0 || nextNodeY > length - 1continue;
                    if (nextNodeX < 0 || nextNodeX > length - 1continue;
                    if (map[nextNodeY][nextNodeX] == 0continue;
 
                    count++;
                    map[nextNodeY][nextNodeX] = 0;
                    q.push(Node(nextNodeY, nextNodeX));
                }
            }
 
            answer.push_back(count);
        }
    }
    
    sort(answer.begin(), answer.end());
 
    cout << answer.size() << endl;
 
    for (int temp : answer)
    {
        cout << temp << endl;
    }
    
}
cs

 

저번에 풀었던 프로그래머스의 퍼즐채우기의 하위호환문제다.

각 영역을 구분해서 타일개수만 구할줄알면 된다.

주어지는 map자체가 방문맵과 동일하기 때문에 따로 방문체크용 bool 배열을 만들필욘없다.