코딩 농장/백준 문제

[백준 C]4963 섬의 개수

GreenBNN 2021. 11. 5. 19:02

DFS, BFS 개념 : https://devuna.tistory.com/32

 

[알고리즘] 깊이 우선 탐색(DFS) 과 너비 우선 탐색(BFS)

[알고리즘] 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS) 그래프를 탐색하는 방법에는 크게 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)이 있습니다. 📌여기서 그래프란, 정점(node)과 그 정점을 연

devuna.tistory.com

1. map[][] 을 한번 만들고 수정할 필요가 없다. -> 수정을 해야한다면 (insert, delete) linkedList 로 연결해주어야겠지?

2. 이어진 섬(1)들 뭉탱이를 찾아야 한다. -> 섬을 발견했을 때 이어진 섬을 찾아야 한다. dir을 이용해 이어진 섬 찾자.

3. 이미 간 섬들을 표시해야한다. -> 섬 노드에 data 넣는게 더 귀찮으니 visited[][]을 만들자.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/*##### DFS,BFS https://devuna.tistory.com/32 #####*/

#define MAX_SIZE 60

int map[MAX_SIZE][MAX_SIZE]; // int **map 으로 나중에 동적할당을 해주려면 scanf 로 입력받은 숫자들을 하나하나 슬라이싱 해줘야함
int visited[MAX_SIZE][MAX_SIZE] = { 0 }; // 방문 안했으면 0
int side[8] = { 1, 1, 0, -1, -1, -1, 0,1 }; // struct 로 하면 dir[8] 만들고 다시 초기화해줘야함
int up[8] = { 0, -1, -1, -1, 0, 1, 1,1 }; //  오른쪽부터 반시계방향
int w, h;
int landNum = 0;

void runTest();
void visit(int h, int w);
void reset();

int main() {

	while (1) {
		runTest();
		if (h == 0 && w == 0) {
			break;
		}
		printf("%d\n", landNum);
		reset();
	}

	return 0;
}
void runTest() {
	scanf("%d %d", &w, &h);
	for (int i = 0; i < h; i++) { // map 생성
		for (int j = 0; j < w; j++) {
			scanf("%d", &map[i][j]);
		}
	}

	for (int i = 0; i < h; i++) { // 섬찾으러가자~
		for (int j = 0; j < w; j++) {
			if (map[i][j] == 1 && visited[i][j] == 0) {
				landNum++;
				visit(i, j);
			}
		}
	}
}
void visit(int h,int w) { // 전달받은 섬과 연결된 놈들 다 방문
	visited[h][w] = 1;

	for (int i = 0; i < 8; i++) {
		if (map[h + up[i]][w + side[i]] == 1 && visited[h + up[i]][w + side[i]] == 0) { //  다음 노드도 섬이고 아직 visit 안했으면 stack 에 넣기
			visit(h+up[i], w+side[i]);
		}
	}

}

void reset() {
	for (int i = 0; i < h; i++) { 
		for (int j = 0; j < w; j++) {
			map[i][j] = 0;
			visited[i][j] = 0;
		}
	}
	landNum = 0;
}

MAX_SIZE 를 50으로 했다가 틀렸습니다 폭탄을 맞아 2시간 동안 뻘짓을 했다.

아직도 왜 오류가 난건지는 모르겠다.

이제 자료구조 수업때 배웠던 것들을 어떤식으로 사용하는지 이해가 간다.

나는 일단 하나의 케이스를 해결하는 코드를 만든 후 그 코드를 이용해 다른 테스트 케이스를 해결하는 방법으로 코드를 짰다. 또한 이후에 만든 코드들을 function 으로 묶어주어 보기 편하게 해주었다.

문제를 편하게 풀기 위해 선언을 다 Global 로 해주었는데 이 방법이 좋은 방법인지 확인해봐야겠다.

그리고 배열을 선언해줄때 arr[10][10] 형식으로 선언해주어 동적할당을 사용 안하려고 했는데 **arr 로 선언하여 동적할당을 할 수 있는 방법도 있다.