chaesoo
so0ob
chaesoo
전체 방문자
오늘
어제
  • 분류 전체보기 (169)
    • 알고리즘 (157)
      • 백준 다시풀기 (8)
      • solved.ac (137)
      • 백준 알고리즘 공부 (12)
    • 활동일지 (5)
    • 개발 (5)
      • Unity (4)
    • 책 공부 (2)
      • clean code (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • BFS
  • dfs
  • 백준2448
  • 자료구조
  • 디코 봇
  • 문자열
  • 클린코드2장
  • C++
  • 백준미세먼지안녕!
  • 소마13기
  • 유니티
  • 구현
  • 다시풀기
  • 분할정복거듭제곱
  • 최단거리알고리즘
  • 정보처리기사 2021 합격률
  • 분할정복
  • 로아 디코봇
  • 플로이드-와샬
  • 게임개발
  • 디스코드 봇 파이썬
  • 클린코드
  • 알고리즘
  • 다익스트라
  • 디코봇 파이썬
  • DP
  • SW마에스트로 13기
  • 로스트아크 디코 봇
  • 백준
  • solved.ac

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
chaesoo

so0ob

알고리즘/solved.ac

[class4] (백준 2638) 치즈

2022. 3. 2. 14:22

문제

N×M의 모눈종이 위에 아주 얇은 치즈가 <그림 1>과 같이 표시되어 있다. 단, N 은 세로 격자의 수이고, M 은 가로 격자의 수이다. 이 치즈는 냉동 보관을 해야만 하는데 실내온도에 내어놓으면 공기와 접촉하여 천천히 녹는다. 그런데 이러한 모눈종이 모양의 치즈에서 각 치즈 격자(작 은 정사각형 모양)의 4변 중에서 적어도 2변 이상이 실내온도의 공기와 접촉한 것은 정확히 한시간만에 녹아 없어져 버린다. 따라서 아래 <그림 1> 모양과 같은 치즈(회색으로 표시된 부분)라면 C로 표시된 모든 치즈 격자는 한 시간 후에 사라진다.

<그림 1>

<그림 2>와 같이 치즈 내부에 있는 공간은 치즈 외부 공기와 접촉하지 않는 것으로 가정한다. 그러므 로 이 공간에 접촉한 치즈 격자는 녹지 않고 C로 표시된 치즈 격자만 사라진다. 그러나 한 시간 후, 이 공간으로 외부공기가 유입되면 <그림 3>에서와 같이 C로 표시된 치즈 격자들이 사라지게 된다.

<그림 2>

<그림 3>

모눈종이의 맨 가장자리에는 치즈가 놓이지 않는 것으로 가정한다. 입력으로 주어진 치즈가 모두 녹아 없어지는데 걸리는 정확한 시간을 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로 표시된다. 또한, 각 0과 1은 하나의 공백으로 분리되어 있다.

출력

출력으로는 주어진 치즈가 모두 녹아 없어지는데 걸리는 정확한 시간을 정수로 첫 줄에 출력한다.

제한

예제 입력 1

8 9
0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0
0 0 0 1 1 0 1 1 0
0 0 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 1 1 0 1 1 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0

예제 출력 1

4

힌트

 

 

 

 

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
#define MAXNUM 101

struct Pos
{
	int x;
	int y;
};

int arr[MAXNUM][MAXNUM];
int visit[MAXNUM][MAXNUM] = { false };
int countAir[MAXNUM][MAXNUM];
int dx[4] = { 1, -1, 0, 0 };
int dy[4] = { 0, 0, 1, -1 };
int n, m;
int result = 0;
queue<Pos> q1;
queue<Pos> q2;
vector<Pos> v;

bool IsRange(Pos pos)
{
	if (pos.x >= 1 && pos.y >= 1 &&
		pos.x <= m && pos.y <= n)
	{
		return true;
	}
	return false;
}

void UpdateAir(Pos startPos)
{
	q1.push(startPos);
	visit[startPos.y][startPos.x] = true;
	while (!q1.empty())
	{
		int x = q1.front().x;
		int y = q1.front().y;
		q1.pop();
		for (int i = 0; i < 4; i++)
		{
			int tempX = x + dx[i];
			int tempY = y + dy[i];
			if (IsRange(Pos{ tempX,tempY }))
			{
				if (!visit[tempY][tempX] && arr[tempY][tempX] == 0) //공기면 큐에 넣고
				{
					visit[tempY][tempX] = true;
					q1.push(Pos{ tempX,tempY });
				}
				else if (arr[tempY][tempX] == 1 && countAir[tempY][tempX] < 2)//공기랑 붙어있는 치즈 리스트 가져오기 치즈면 걔한테 카운터 ++해주기?
				{
					countAir[tempY][tempX]++;
					if (countAir[tempY][tempX] == 2)
					{
						v.push_back(Pos{ tempX,tempY });
					}
				}
			}
		}
	}
}

void RemoveCheese()
{
	while (!v.empty())
	{
		for (auto iter = v.begin(); iter < v.end(); iter++) //
		{
			q2.push(*iter);
		}
		v.clear();

		while (!q2.empty())
		{
			Pos temp = q2.front();
			q2.pop();

			for (int i = 0; i < 4; i++)
			{
				int tempX = temp.x + dx[i];
				int tempY = temp.y + dy[i];

				if (IsRange({ tempX,tempY }))
				{
					if (!visit[tempY][tempX] && arr[tempY][tempX] == 0)
					{
						UpdateAir({ tempX,tempY });
					}
					else if (arr[tempY][tempX] == 1 && countAir[tempY][tempX] < 2)
					{
						countAir[tempY][tempX]++;
						if (countAir[tempY][tempX] == 2)
						{
							v.push_back(Pos{ tempX,tempY });
						}
					}
				}
			}
		}
		result++;
	}
}


int main()
{
	cin >> n >> m;
	for (int y = 1; y <= n; y++)
	{
		for (int x = 1; x <= m; x++)
		{
			cin >> arr[y][x];
		}
	}
	UpdateAir(Pos{ 1, 1 });
	RemoveCheese();
	cout << result;
	return 0;
}
728x90
반응형

'알고리즘 > solved.ac' 카테고리의 다른 글

[class4] (백준 1043) 거짓말  (0) 2022.03.03
[class6] (백준 14725) 개미굴  (0) 2022.03.02
[class4] (백준 17070) 파이프 옮기기 1  (0) 2022.03.01
[class4] (백준 15686) 치킨 배달  (0) 2022.02.25
[class4] (백준 11444) 피보나치 수 6  (0) 2022.02.24
    '알고리즘/solved.ac' 카테고리의 다른 글
    • [class4] (백준 1043) 거짓말
    • [class6] (백준 14725) 개미굴
    • [class4] (백준 17070) 파이프 옮기기 1
    • [class4] (백준 15686) 치킨 배달
    chaesoo
    chaesoo

    티스토리툴바