Algorithm/λ¬Έμ œν’€μ΄

[λ°±μ€€] 4963번 - μ„¬μ˜ 개수 (C++)

moaoh 2023. 9. 11. 22:32

 

4963번: μ„¬μ˜ 개수

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μ§€λ„μ˜ λ„ˆλΉ„ w와 높이 hκ°€ μ£Όμ–΄μ§„λ‹€. w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ 쀄뢀터 h개 μ€„μ—λŠ” 지도

www.acmicpc.net

문제

μ •μ‚¬κ°ν˜•μœΌλ‘œ 이루어져 μžˆλŠ” 섬과 λ°”λ‹€ 지도가 μ£Όμ–΄μ§„λ‹€. μ„¬μ˜ 개수λ₯Ό μ„ΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

ν•œ μ •μ‚¬κ°ν˜•κ³Ό κ°€λ‘œ, μ„Έλ‘œ λ˜λŠ” λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” μ‚¬κ°ν˜•μ€ κ±Έμ–΄κ°ˆ 수 μžˆλŠ” μ‚¬κ°ν˜•μ΄λ‹€. 

두 μ •μ‚¬κ°ν˜•μ΄ 같은 섬에 있으렀면, ν•œ μ •μ‚¬κ°ν˜•μ—μ„œ λ‹€λ₯Έ μ •μ‚¬κ°ν˜•μœΌλ‘œ κ±Έμ–΄μ„œ 갈 수 μžˆλŠ” κ²½λ‘œκ°€ μžˆμ–΄μ•Ό ν•œλ‹€. μ§€λ„λŠ” λ°”λ‹€λ‘œ λ‘˜λŸ¬μ‹Έμ—¬ 있으며, 지도 λ°–μœΌλ‘œ λ‚˜κ°ˆ 수 μ—†λ‹€.

 

 

μž…λ ₯

μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μ§€λ„μ˜ λ„ˆλΉ„ w와 높이 hκ°€ μ£Όμ–΄μ§„λ‹€. w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

λ‘˜μ§Έ 쀄뢀터 h개 μ€„μ—λŠ” 지도가 μ£Όμ–΄μ§„λ‹€. 1은 λ•…, 0은 바닀이닀.

μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 두 개 μ£Όμ–΄μ§„λ‹€.

 

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, μ„¬μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이과정

λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” 사항이 μ—°μ ‘λ˜μ§€μ•Šμ€ μ„¬μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” 문제둜 bfsλ₯Ό 톡해 μ „λΆ€ 탐색을 ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ˜€μ—ˆλ‹€.

* * *

* 1 *

* * *

1을 κΈ°μ€€μœΌλ‘œ λͺ¨λ“  λ²”μœ„λ₯Ό λ‹€ κ²€μ‚¬ν•΄μ•Όν•΄μ„œ dirμ΄λΌλŠ” λ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ„œ μ²΄ν¬ν•΄μ£ΌλŠ” 역할을 ν•΄μ£Όμ—ˆλ‹€.

 

 

code

#include <iostream>
#include <cstring>
#include <queue>

int		dir[2][8] = {{-1, -1, -1, 0, 0, 1, 1, 1}, {-1, 0, 1, -1, 1, -1, 0, 1}};
int		island[51][51];

void	bfs(int h, int w, int y, int x)
{
	int tempY, tempX;
	std::queue <std::pair<int, int> > que;
	std::pair <int, int> temp;

	que.push(std::make_pair(y, x));
	island[y][x] = -1;
	while (!que.empty())
	{
		temp = que.front();
		que.pop();
		for (int j = 0; j < 8; j++) {
			tempY = temp.first + dir[0][j];
			tempX = temp.second + dir[1][j];
			if (h <= tempY || w <= tempX || tempY < 0 || tempX < 0) continue;
			if (island[tempY][tempX] == 1) {
				island[tempY][tempX] = -1;
				que.push(std::make_pair(tempY, tempX));
			}
		}
	}
}

int		main(void)
{
	int w, h, count;

	while (true)
	{
		std::cin >> w >> h;
		if (w == 0 && h == 0) break;
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < w; j++) {
				std::cin >> island[i][j];
			}
		}
		count = 0;
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < w; j++) {
				if (island[i][j] == 1) {
					bfs(h, w, i, j);
					count++;
				}
			}
		}
		std::memset(island, -1, sizeof(island));
		std::cout << count << "\n";
	}
	
	return (0);
}

 

ν›„κΈ°

문제 μžμ²΄κ°€ μ΅μˆ™ν–ˆλ˜ 문제라 크게 μ–΄λ ΅μ§€μ•Šκ²Œ μ ‘κ·Όν•  수 μžˆμ—ˆλ‹€.