Algorithm

[백준 1926] 그림

moguogu 2022. 6. 27. 15:40

문제설명

알고리즘

1. 가로 세로 및 그림의 정보 입력 및 저장

2. dfs 알고리즘을 사용하되, 가로세로 연속된 그림의 넓이와 수를 구함

3. 출력

코드

#include<iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAX 505

int graph[MAX][MAX];
int visited[MAX][MAX];
int max_width, N,M,width;
void dfs(int x,int y) {

	visited[x][y] = true; //방문
	width++;

	//가로 세로 넓이 구함, 단 범위 판단 필수 
	if (graph[x + 1][y] == 1 && visited[x + 1][y] == 0 && (x+1 < N)) {
		dfs(x + 1, y);
	}
	if (graph[x - 1][y] == 1 && visited[x -1][y] == 0 && (x-1 >= 0) ) {
		dfs(x - 1, y);
	}
	if (graph[x ][y+1] == 1 && visited[x ][y+1] == 0 && (y + 1 < M)) {
		dfs(x , y+1);
	}
	if (graph[x][y-1] == 1 && visited[x ][y-1] == 0 && (y - 1 >= 0))  {
		dfs(x , y-1);
	}
}


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

	int cnt=0;
	cin >> N >> M;

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			cin >> graph[i][j];
		}
	}

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			if (graph[i][j] == 1 && visited[i][j] == 0)
			{
				width = 0; //넓이 초기화 
				dfs(i, j);
				cnt++; //섬의 수 
				max_width = max(max_width, width); //가장 넓은 섬의 넓이 구하기 
			}				
		}
	}

	// 출력
	if (cnt != 0)
		cout << cnt << '\n' << max_width;
	else
		cout << 0 << '\n' << 0;
	
}

고찰

간단한 dfs 문제였는데, 7%에서 계속 틀렸다고 나왔다.

처음엔 이유를 몰랐는데 테스트 케이스가 부족했다

 

bfs에서 구하는 것처럼 visited를 int로 해서 1씩 증가시키게 구했는데 ㄹ 모양으로 연결된 예제에선 최대 넓이가 잘못나온다

 

'Algorithm' 카테고리의 다른 글

[백준 1946] 신입 사원  (0) 2022.06.30
[백준 1107] 리모컨  (0) 2022.06.30
[백준 18352] 특정 거리의 도시 찾기  (0) 2022.06.25
[백준 1026] 보물  (0) 2022.06.24
[프로그래머스] 구명보트  (0) 2022.06.24