기타:: 230124 일기

2023. 1. 24. 11:51·Problem Solving/문제풀이
반응형

병원 갔다온 이후 일주일간 약 안 먹고 살다가 감기가 더 심해졌다..

그래서 일주일간 내 맘대로 살았다가 다시 문제 풀어 봤는데 뭔가 코드 치는게 어색하다.

이래서 꾸준함이 중요한건가

백준 풀이 - BFS 연습문제

문제리뷰

2573 빙산 : 얼음을 한꺼번에 녹여야 하는데 녹이는 순서를 줘서 처음에 틀림

 

2573 빙산

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

int n, m;
int iceberg[300][300];
int vis[300][300];
int melt[300][300];

int GetSplitNum() {
	for(int i = 0; i < n; i++)
		fill(vis[i], vis[i]+m, 0);
	
	int cnt = 0;
	queue<pair<int, int>> Q;
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < m; j++) {
			if(vis[i][j] || iceberg[i][j] == 0) continue;
			vis[i][j] = 1;
			Q.push({i, j});
			cnt++;
			
			while(!Q.empty()) {
				pair<int, int> 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(vis[nx][ny] || iceberg[nx][ny] == 0) continue;
					vis[nx][ny] = 1;
					Q.push({nx, ny});
				}
			}
		}
	}
	
	return cnt;
}

int main() {
	cin >> n >> m;
	
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
			cin >> iceberg[i][j];
	
	queue<pair<int, int>> Q;
	
	int year = 0;
	while(true) {
		int num = GetSplitNum();
		if(num > 1) {
			cout << year;
			break;
		}
		if(num == 0) {
			cout << 0;
			break;
		}
		
		year++;
		for(int i = 0; i < n; i++) {
			fill(vis[i], vis[i]+m, 0);
			fill(melt[i], melt[i]+m, 0);
		}
			
		
		// 얼마나 녹아야 하는지 저장
		for(int i = 0; i < n ; i++) {
			for(int j = 0; j < m; j++) {
				if(vis[i][j] || iceberg[i][j] == 0) continue;
				vis[i][j] = 1;
				Q.push({i, j});
				
				while(!Q.empty()) {
					pair<int, int> 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(iceberg[nx][ny] == 0 && iceberg[cur.X][cur.Y] > 0) 
							melt[cur.X][cur.Y]++;
						if(vis[nx][ny] || iceberg[nx][ny] == 0) continue;
						
						vis[nx][ny] = 1;
						Q.push({nx, ny});
					}
				}
			}
		}
		
		// 한꺼번에 녹이기
		for(int i = 0; i < n ; i++) {
			for(int j = 0; j < m; j++) {
				if(iceberg[i][j] - melt[i][j] < 0) iceberg[i][j] = 0;
				else iceberg[i][j] -= melt[i][j];
			}
		}
	}
    
	return 0;
}
반응형

'Problem Solving > 문제풀이' 카테고리의 다른 글

기타:: 230207 일기  (0) 2023.02.08
기타:: 230131 일기  (0) 2023.01.31
기타:: 230118 일기  (0) 2023.01.18
기타:: 230117 일기  (1) 2023.01.17
기타:: 230116 일기  (0) 2023.01.16
'Problem Solving/문제풀이' 카테고리의 다른 글
  • 기타:: 230207 일기
  • 기타:: 230131 일기
  • 기타:: 230118 일기
  • 기타:: 230117 일기
나귀당
나귀당
게임 클라이언트 개발자의 개인 블로그 (기술, 개발일지, 성찰)
  • 나귀당
    나귀라 카더라
    나귀당
    • 분류 전체보기 (167) N
      • 개발 (0)
        • 게임 (9)
        • 서브 (9)
        • 기타 (8)
      • Computer Science (20)
        • 머신러닝 (5)
        • 정보보안 (6)
        • 컴퓨터비전 (8)
        • 컴퓨터그래픽스 (1)
      • Problem Solving (51) N
        • 이론 (17)
        • 문제풀이 (31) N
        • 기타 (3)
      • 개인 (55)
        • Careers (1)
        • 회고+계획 (34)
        • 후기 (13)
        • 좌충우돌 (2)
        • 독서 (5)
      • 학교 (업뎃X) (15)
        • 과제 (2)
        • 수업관련 (9)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
나귀당
기타:: 230124 일기
상단으로

티스토리툴바