BOJ

[BOJ] 백준 2638번 치즈 C++

2022. 3. 25. 21:33
목차
  1. 문제
  2. 풀이
  3. 코드
  4.  

문제

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

 

2638번: 치즈

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

www.acmicpc.net

풀이

골드5 치즈 문제를 풀고 이 문제를 접했다면 쉽게 풀 수 있었을 것이다.

이 치즈 문제는 골드5 치즈 문제와 다르게 치즈에서 각 치즈 격자의 4변 중에서 적어도 2변 이상이 실내온도의 공기와 접촉한 것을 찾아내 녹여줘야하기 때문에 checkboard라는 2차원 배열을 새로 만들어 실내온도의 공기와 접촉한 변의 개수를 저장해주었다.

탐색을 하다가 치즈이면서, checkboard의 값이 0이면 1을 증가 시켜주고, 치즈이면서 checkboard의 값이 1이라면 원본 board의 값을 0으로 만들어 치즈를 녹여주었다. 추가로 방문처리를 해주었는데 그 이유는 board의 값이 0으로 바뀌면서 그 좌표에 대해서 탐색을 할 수도 있기 때문에 방문처리를 하여 이번 BFS에 녹게되어 0이된 board에 대해서는 탐색을 못하도록 막아주었다.

이렇게 설계한 BFS를 바탕으로 탐색을 하고 매 탐색마다 녹일 수 있는 상태인지 체크해주어(보드에 치즈가 남아 있는지) 확인하여 녹일 수 있으면 while문 안의 내용을 계속 진행하고 아니라면 시간을 출력해주고 프로그램을 종료해주었다.

 

코드

#include <iostream>
#include <algorithm>
#include <queue>
#define x first
#define y second

using namespace std;

int n, m;
int cnt = 0;
int board[101][101];
bool visited[101][101];
int checkBoard[101][101];
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };

bool canMelt()
{
	for (int i = 0; i <= n; i++)
	{
		for (int j = 0; j <= m; j++)
		{
			if (board[i][j] == 1)
			{
				return true;
			}
		}
	}
	return false;
}

void reset()
{
	for (int i = 0; i <= n; i++)
	{
		for (int j = 0; j <= m; j++)
		{
			visited[i][j] = false;
			checkBoard[i][j] = 0;
		}
	}
}

void bfs()
{
	queue<pair<int, int>> q;

	q.push({ 0,0 });
	visited[0][0] = true;

	while (!q.empty())
	{
		auto cur = q.front();
		q.pop();

		for (int dir = 0; dir < 4; dir++)
		{
			int nx = cur.x + dx[dir];
			int ny = cur.y + dy[dir];

			if (nx < 0 || nx >= n || ny < 0 || ny >= m)
			{
				continue;
			}
			if (visited[nx][ny])
			{
				continue;
			}

			if (board[nx][ny] == 1 && checkBoard[nx][ny] == 0)
			{
				checkBoard[nx][ny]++;
				continue;
			}
			if (board[nx][ny] == 1 && checkBoard[nx][ny] == 1)
			{
				board[nx][ny] = 0;
				visited[nx][ny] = true;
				continue;
			}

			visited[nx][ny] = true;
			q.push({ nx, ny });
		}
	}
}

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

	cin >> n >> m;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> board[i][j];
		}
	}

	while (true)
	{
		reset();
		cnt++;
		bfs();

		if (!canMelt())
		{
			cout << cnt;
			return 0;
		}
	}
}

 

 

'BOJ' 카테고리의 다른 글

[BOJ] 백준 14889번 스타트와 링크 C++(삼성 기출문제)  (0) 2022.03.31
[BOJ] 백준 9663번 N-Queen C++  (0) 2022.03.30
[BOJ] 백준 16234번 인구 이동 C++(삼성 기출문제)  (0) 2022.03.28
[BOJ] 백준 3055번 탈출 C++  (0) 2022.03.25
[BOJ] 백준 2573번 빙산 C++  (0) 2022.03.25
  1. 문제
  2. 풀이
  3. 코드
  4.  
'BOJ' 카테고리의 다른 글
  • [BOJ] 백준 9663번 N-Queen C++
  • [BOJ] 백준 16234번 인구 이동 C++(삼성 기출문제)
  • [BOJ] 백준 3055번 탈출 C++
  • [BOJ] 백준 2573번 빙산 C++
Doshisha
Doshisha
Doshisha
Doshisha
Doshisha
전체
오늘
어제
  • 분류 전체보기
    • Java
    • Spring
    • Project
      • Gameple
      • 피파온라인 검색 사이트
    • Node.js
    • DBMS
      • MySQL
      • MSSQL
    • AWS
    • BOJ
    • 프로그래머스
    • 프로그래머스-SQL
    • 컴퓨터 구조
    • 네트워크
    • Git
    • IDE
    • 후기 및 회고
    • 기타
    • Linux
    • Frontend
      • Vue.js
      • jQuery
      • JavaScript
    • Unity
    • WAS
      • Tomcat
    • Jenkins

블로그 메뉴

  • 방명록
  • Github

공지사항

인기 글

태그

  • MySQL
  • Gameple
  • SpringBoot Jenkins
  • 백트래킹
  • 카카오
  • 코테
  • BFS
  • 게임 플랫폼
  • 백준
  • 자바
  • java
  • 카카오 코테
  • C++ BFS
  • mysql 서브쿼리
  • 게임 API 연동
  • 문자열
  • 네트워크
  • 프로그래머스
  • 카카오 코딩테스트
  • boj
  • 모두의 네트워크
  • 구현
  • SpringBoot Jenkins CI/CD
  • 넥슨 오픈 API
  • 게임 플랫폼 개발
  • 일본
  • Spring Data JPA
  • 프로그래머스 SQL
  • c++
  • DP

최근 댓글

최근 글

hELLO · Designed By 정상우.
Doshisha
[BOJ] 백준 2638번 치즈 C++
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.