[백준 00000] 치즈 (C++)

2023. 12. 19. 01:12·PS/백준 알고리즘[BOJ]
728x90

 

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>

#define F first
#define S second
#define IN(Y, X) Y >=0 && Y < N && X >=0 && X < M

using namespace std;

int N, M, cheese, board[100][100];
bool visit[100][100];
queue<pair<int, int>> q;
vector<pair<int, int>> melt;

int dy[4] = { 0, 1, 0, -1 };
int dx[4] = { 1, 0, -1, 0 };


void BFS(int y, int x) {
	visit[y][x] = true;
	q.push({ y, x });

	while (!q.empty()) {
		pair<int, int> front = { q.front().F, q.front().S };
		q.pop();
		for (int i = 0; i < 4; i++) {
			int ny = front.F + dy[i];
			int nx = front.S + dx[i];
			if (IN(ny, nx) && !visit[ny][nx]) {
				if (!board[ny][nx]) {
					q.push({ ny, nx });
					visit[ny][nx] = true;
				}
				else board[ny][nx]++;
				//공기와 닿은 면적이 2 이상이면 녹이기 위해 좌표 저장해두기
				if (board[ny][nx] >= 3) {
					melt.push_back({ ny, nx });
					visit[ny][nx] = true;
				}
			}
		}
	}
}

int solve() {
	int t = 0;	
	while (cheese) {
		//탐색하고
		BFS(0, 0);
		//녹이고
		cheese -= melt.size();  //cheese 크기 제거
		while (!melt.empty()) {
			board[melt.back().F][melt.back().S] = 0;
			melt.pop_back();
		}
		//다음 탐색을 위하여 값들 초기화해주기
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				if (board[i][j] >= 2) board[i][j] = 1;
			}
		}
		memset(visit, 0, sizeof(visit));
		t++;
	}
	return t;
}

int main(void) {
	cin.tie(0);
	cout.tie(0);
	ios_base::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];
			if (board[i][j]) cheese++;
		}
	}
	cout << solve();
}
728x90
저작자표시 비영리 (새창열림)

'PS > 백준 알고리즘[BOJ]' 카테고리의 다른 글

[백준 2504번] 괄호의 값 (C++)  (1) 2023.12.21
[백준 10026] 적록색약 (C++)  (0) 2023.12.19
[백준 2231번] 분해합 (C++)  (1) 2023.12.15
[백준 2217번] 로프 (C++)  (1) 2023.12.11
[백준 2293번] 동전1 (C++) (시행착오부터 DP를 떠올리기까지의 아주 자세한 사고과정 기록)  (2) 2023.11.08
'PS/백준 알고리즘[BOJ]' 카테고리의 다른 글
  • [백준 2504번] 괄호의 값 (C++)
  • [백준 10026] 적록색약 (C++)
  • [백준 2231번] 분해합 (C++)
  • [백준 2217번] 로프 (C++)
BE_개발자
BE_개발자
경이로운 BE 개발자가 되기 위한 프로그래밍 공부 기록장
    250x250
  • BE_개발자
    경이로운 개발일기
    BE_개발자
  • 전체
    오늘
    어제
    • 전체 보기 (213)
      • AI (1)
        • AI native (0)
        • Skill (0)
      • SpringBoot (4)
        • JPA (3)
        • Security (0)
        • 튜토리얼 (1)
        • 기타 (0)
      • Infra (0)
        • Docker (0)
        • AWS (0)
        • NCP (0)
        • GCP (0)
      • React (19)
      • 서버 (0)
      • Computer Science (16)
        • SW Engineering (10)
        • Data Base (2)
        • OS(운영 체제) (4)
      • Data science (0)
        • Probability & Random Variab.. (0)
        • Data Analysis(데이터 분석) (0)
      • 자료구조 | 알고리즘 (57)
        • 선형 자료구죠 (6)
        • 비선형 자료구조 (9)
        • 정렬(Sort) (3)
        • 탐색(Brute Force) (7)
        • 분할 정복(Devide Conquer) (3)
        • 동적 계획법 (6)
        • 탐욕(Greedy) (2)
        • 수학 (7)
        • 심화 알고리즘 (10)
      • PS (44)
        • 백준 알고리즘[BOJ] (38)
        • 프로그래머스[programmers] (3)
      • Dev tool (15)
        • 개발 도구 및 환경 (0)
        • vscode (3)
        • Git Hub (4)
        • Chrome 웹스토어 (5)
        • Python 전용 개발환경 (0)
      • 성장기록 (1)
      • 개인 project (14)
        • 홈페이지 만들기 (11)
        • 냉보미 (1)
      • STL(Standard Library) (9)
      • programming Language (1)
        • javascript (1)
      • 기타 (13)
        • html css (11)
      • (책, 글, 블로그)리뷰 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 백준
    • Github
    • Notion
    • 서울과학기술대학교 학술동아리 EC
  • 공지사항

  • 인기 글

  • 태그

    DP
    OS
    탐색
    이분 탐색
    재귀함수
    스프링부트
    CS
    BFS
    수학
    백트래킹
    stl
    stack
    SW Engineering
    스택
    프론트엔드
    괄호쌍
    백준
    react
    PS
    완전 탐색
    브루트포스
    자료구조
    분할정복
    순열
    그리디
    비트마스킹
    알고리즘
    C++
    SW 공학
    운영체제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
BE_개발자
[백준 00000] 치즈 (C++)
상단으로

티스토리툴바