일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 클린코드
- 책리뷰
- #알고리즘 #백준 #2573 #백준2573 #algorithm #baekjoon #baekjoon2573 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #괄호변환 #programmers #C++
- #알고리즘 #백준 #2580 #백준2580 #algorithm #baekjoon #baekjoon2580 #Java
- #알고리즘 #백준 #3190 #백준3190 #algorithm #baekjoon #baekjoon3190 #C++
- #알고리즘 #백준 #17136 #백준17136 #algorithm #baekjoon #baekjoon17136 #C++
- #알고리즘 #백준 #1793 #백준1793 #algorithm #baekjoon #baekjoon1793 #C++
- #알고리즘 #백준 #1525 #백준1525 #algorithm #baekjoon #baekjoon1525 #C++
- #알고리즘 #백준 #1260 #백준1260 #algorithm #baekjoon #baekjoon1260 #Java
- 스레드 #동시성 #thread #process #
- CleanCode
- #알고리즘 #백준 #15684 #백준15684 #algorithm #baekjoon #baekjoon15684 #C++
- #알고리즘 #백준 #5214 #백준5214 #algorithm #baekjoon #baekjoon5214 #C++
- #알고리즘 #백준 #15683 #백준15683 #algorithm #baekjoon #baekjoon15683 #C++
- #알고리즘 #백준 #2352 #백준2352 #algorithm #baekjoon #baekjoon2352 #C++
- #알고리즘 #백준 #12094 #백준12094 #algorithm #baekjoon #baekjoon12094 #C++
- #알고리즘 #백준 #2616 #백준2616 #algorithm #baekjoon #baekjoon2616 #Java
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #블록이동하기 #programmers #C++
- 개발자취미
- #알고리즘 #백준 #17406 #백준17406 #algorithm #baekjoon #baekjoon17406 #C++
- 개발서
- #알고리즘 #백준 #1987 #백준1987 #algorithm #baekjoon #baekjoon1987 #Java
- #알고리즘 #백준 #17140 #백준17140 #algorithm #baekjoon #baekjoon17140 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #문자열압축 #programmers #C++
- #알고리즘 #백준 #14888 #백준14888 #algorithm #baekjoon #baekjoon14888 #C++
- #알고리즘 #백준 #17472 #백준17472 #algorithm #baekjoon #baekjoon17472 #C++
- #알고리즘 #algorithm #프로그래머스 #2020카카오공채 #외벽점검 #programmers #C++
- #알고리즘 #백준 #4386 #백준4386 #algorithm #baekjoon #baekjoon4386 #C++
- #알고리즘 #백준 #17837 #백준17837 #algorithm #baekjoon #baekjoon17837 #C++
Archives
- Today
- Total
개발자 일기장.
백준 2573. 빙산 본문
2573 빙산
문제해결 사진
문제 알고리즘
- bfs
- 시뮬레이션
풀이방법
문제를 3단계로 나눠서 풀었다.
- 주변에 있는 개수를 체크하여 빙산을 업데이트
- 빙산이 두 덩어리 이상으로 분리되었는지 확인하고, 분리되었으면 종료
- 빙산이 없는지 체크하고 없으면 0 출력
- 핵심 코드
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
// static
const int MAX = 300;
const pair<int, int> dir[4] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };
// variable
int board[MAX][MAX], cpyboard[MAX][MAX];
int N, M;
int answer; // year
bool visited[MAX][MAX];
queue<pair<int, int>> q;
// 범위내 체크
bool isInRange(int y, int x) {
if (y < 0 || y > N || x < 0 || x > M)
return false;
return true;
}
// 빙산 업데이트
void updateGlacier() {
// origin -> cpy
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
cpyboard[i][j] = board[i][j];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[i][j]) {
int cnt = 0;
for (int d = 0; d < 4; d++) {
int nextY = i + dir[d].first;
int nextX = j + dir[d].second;
// 범위안이고 주변에 바다인 경우
if (isInRange(nextY, nextX) && board[nextY][nextX] == 0) {
cnt++;
}
}
if (cpyboard[i][j] >= cnt)
cpyboard[i][j] -= cnt;
else
cpyboard[i][j] = 0;
}
}
}
// cpy -> origin
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
board[i][j] = cpyboard[i][j];
}
// 빙하가 두개로 분리되어 있으면 종료
bool isSeperated() {
bool isOne = false; // 한개인지 체크
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
visited[i][j] = false;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
// 빙하가 아닌 경우
if (board[i][j] && !visited[i][j]) {
if (!isOne) {
q.push({ i, j });
visited[i][j] = true;
isOne = true;
while (!q.empty()) {
int curY = q.front().first;
int curX = q.front().second;
q.pop();
for (int d = 0; d < 4; d++) {
int nextY = curY + dir[d].first;
int nextX = curX + dir[d].second;
if (isInRange(nextY, nextX) && board[nextY][nextX] && !visited[nextY][nextX]) {
q.push({ nextY, nextX });
visited[nextY][nextX] = true;
}
}
}
}
else
return true; // 두번째 덩어리가 있는 경우
}
}
}
return false;
}
// 빙하가 없으면 true
bool isNoGlacier() {
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (board[i][j])
return false;
return true;
}
int main() {
// input
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf("%d", &board[i][j]);
}
}
// solution
while (true) {
answer++;
updateGlacier();
// check code
/* cout << answer << "\n";
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++)
printf("%d ", board[i][j]);
cout << "\n";
}*/
if (isSeperated()) {
break;
}
if (isNoGlacier()) {
answer = 0;
break;
}
}
// output
cout << answer << "\n";
return 0;
}
문제 후 느낀점
- 생각한대로 바로 풀린 문제.
'취업 > Algorithm.' 카테고리의 다른 글
[2020 KAKAO BLIND RECRUITMENT] 외벽 점검 (0) | 2020.05.02 |
---|---|
백준 14888. 연산자 끼워넣기 (0) | 2020.05.02 |
[2020카카오공채] 괄호 변환 (0) | 2020.04.11 |
백준 17837. 새로운 게임2 (0) | 2020.04.11 |
백준 17140. 이차원배열과 연산 (0) | 2020.04.11 |