[백준/C++] 단지번호붙이기_2667

leeact·2023년 5월 17일
1

[백준/c++]

목록 보기
9/24
post-thumbnail

📝 문제

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

💻 코드

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>

using namespace std;

struct Node {
	int row;
	int col;
};

int dr[] = { 0, 0, 1, -1 };
int dc[] = { 1, -1, 0, 0 };
int n;
int arr[25][25] = { 0, };
int check[25][25] = { 0, };
queue<Node> q;
int answer = 0;
vector<int> cnt_apart;

void bfs(int row, int col) {
	check[row][col] = 1;
	q.push({ row, col });
	int cnt = 1;

	while (!q.empty()) {
		Node now = q.front();
		q.pop();
		for (int i = 0; i < 4; i++) {
			int nextRow = now.row + dr[i];
			int nextCol = now.col + dc[i];
			if (nextRow < 0 || nextCol < 0 || nextRow >= n || nextCol >= n) continue;
			if (check[nextRow][nextCol]) continue;
			if (!arr[nextRow][nextCol]) continue;
			check[nextRow][nextCol] = 1;
			q.push({ nextRow, nextCol });
			cnt += 1;
		}
		
	}
	cnt_apart.push_back(cnt);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin >> n;

	for (int i = 0; i < n; i++) {
		string temp;
		cin >> temp;
		for (int j = 0; j < temp.size(); j++) {
			arr[i][j] = int(temp[j] - '0');
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (arr[i][j] == 1 && !check[i][j]) {
				bfs(i, j);
				answer += 1;
			}
		}
	}
	
	
	cout << answer;
	cout << "\n";
	sort(cnt_apart.begin(), cnt_apart.end());
	for (int i = 0; i < cnt_apart.size(); i++) {
		cout << cnt_apart[i] << "\n";
	}


	return 0;
}

💡 Point

문제의 오름차순을 까먹고 단지순으로 출력해서 틀렸다.
algorithm을 추가하여 sort로 정렬하면 성공!

✔ 느낀 점

그냥 빠른 입출력을 위해 아무 생각없이 코드를 추가했었는데, 이번에 정리하면서 코드가 어떻게 작동되고, 왜 시간을 절약할 수 있는지 이해하게 되어 더 오랫동안 기억에 남을 것 같다!!🤩

1개의 댓글

comment-user-thumbnail
2023년 5월 22일

느낀점 너무 가식같아요!^^ㅎ

답글 달기