본문 바로가기
백준 코딩테스트/실버

1388) 바닥 장식

by xortl98 2022. 6. 18.
728x90

 출처 

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

 

1388번: 바닥 장식

형택이는 건축가이다. 지금 막 형택이는 형택이의 남자 친구 기훈이의 집을 막 완성시켰다. 형택이는 기훈이 방의 바닥 장식을 디자인했고, 이제 몇 개의 나무 판자가 필요한지 궁금해졌다. 나

www.acmicpc.net

 내 풀이 

#include<iostream>
#include<queue>

using namespace std;

int N = 0, M = 0;	//처음 입력 받을 값
int wood = 0;	//정답이 될 나무

char floors[51][51];
bool visited[51][51];

void BFS(int i, int j, bool type);

int main()
{
	cin >> N >> M;

	for (int i = 0; i < N; i++)
	{
		string input = "";
		cin >> input;
		for (int j = 0; j < M; j++)
		{
			floors[i][j] = input[j];
		}
	}


	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			//좌우 탐색
			if (floors[i][j] == '-' && !visited[i][j])
			{
				BFS(i, j, true);
				wood++;
			}
			//상하 탐색
			else if (floors[i][j] == '|' && !visited[i][j])
			{
				BFS(i, j, false);
				wood++;
			}
		}
	}

	cout << wood;
}

void BFS(int i, int j, bool type)
{
	queue<char>q;
	q.push(floors[i][j]);
	visited[i][j] = true;

	int cnt = 0;

	if (type)  cnt = j;
	else  cnt = i;
	
	while (!q.empty())
	{
		char cnt_floor = q.front();	
		q.pop();

		//우측 탐색일 경우 j값을 더해야함
		if (type)
		{

			if (cnt + 1 >= M) continue;

			if (!visited[i][cnt+1] && floors[i][cnt] == floors[i][cnt + 1])
			{
				q.push(floors[i][cnt+1]);
				visited[i][cnt + 1] = true;
			}
			cnt++;
		}

		//아래측 탐색일 경우  i값을 더해야함 
		else
		{
			if (cnt + 1 >= N) continue;

			if (!visited[cnt + 1][j] && floors[cnt][j] == floors[cnt + 1][j])
			{
				q.push(floors[cnt + 1][j]);
				visited[cnt + 1][j] = true;
			}
			cnt++;
		}
	}
}

 해설

BFS로 2개의 경우의 수 ( - , | ) 를 bool로 구분 후 풀어주었다.

 느낀점 

오랜만에 BFS로 문제를 풀다보니 많이 해맸다.

'백준 코딩테스트 > 실버' 카테고리의 다른 글

3187) 양치기 꿍 (C++)  (2) 2022.06.19
5635) 생일 (C++)  (0) 2022.06.11
1748) 수 이어 쓰기 1 (C++)  (0) 2022.06.06
1057) 토너먼트 (C++)  (0) 2022.06.05
11931) 수 정렬하기 4 (C++)  (0) 2022.06.03