본문 바로가기
Programming/Algorithm

백준 치즈

by OKOK 2018. 2. 8.

/*

치즈,

원래치즈

1시간 후 치즈

2시간 후 치즈

마지막에 모두 녹았는지 검사하는 것이 필요합니다.

0에 대해서 오케이. 0에 대해서 어떻게 해야하는 것이지.


0에서 연결된 0을 찾고 그 옆에 4방향을 돌려보아서 1이 있으면 지우도록 합니다.

일단 0으로 연결된 부분에 대해서 찾아보도록 하겠습니다.


이제 다시 check 배열을 초기화 한다음에,

어떻게 해야하지? 이금 보면

먼저 0을 찾은 다음에 0에 대해서 체크배열에서 1로 변경한다음에

지우는 것에 따라서 

*/


#include <iostream>

#include <queue>

using namespace std;


#define SIZE 101


int map[SIZE][SIZE];

int check[SIZE][SIZE];

int n, m;

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

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

int x, y, nx, ny;

int cheese_num;

int hour;

int cheese_numArr[100];


struct points {

int x, y;

};

queue<points> que;


void problemIn() {

cin >> n >> m;

for (int i = 0; i < n; i++) {

for (int j = 0; j < m; j++) {

cin >> map[i][j];

check[i][j] = 1;

}

}

}


void check_reset() {

for (int i = 0; i < n; i++) {

for (int j = 0; j < m; j++) {

check[i][j] = 1;

}

}

}


void bfs_find_zero() {

que.push({ 0,0 });

check[0][0] = 0;


while (!que.empty()) {

x = que.front().x;

y = que.front().y;

que.pop();

for (int i = 0; i < 4; i++) {

nx = x + dx[i];

ny = y + dy[i];

if (nx >= 0 && ny >= 0 && nx < n && ny < m) {

if (map[nx][ny] == 0 && check[nx][ny] == 1) {

check[nx][ny] = 0;

que.push({ nx,ny });

}

}

}

}

}


void erase() {

for (int i = 0; i < n; i++) {

for (int j = 0; j < m; j++) {

if (check[i][j] == 0) {

x = i;

y = j;

for (int i = 0; i < 4; i++) {

nx = x + dx[i];

ny = y + dy[i];

if (map[nx][ny] == 1) {

map[nx][ny] = 0;

}

}

}

}

}

}


void cheese_num_cnt() {

cheese_num = 0;

for (int i = 0; i < n; i++) {

for (int j = 0; j < m; j++) {

if (map[i][j] == 1) {

cheese_num++;

}

}

}


cheese_numArr[hour] = cheese_num;

}


void solve() {

cheese_num_cnt();


while (cheese_num > 0) {

bfs_find_zero();

erase();

check_reset();

hour++;

cheese_num_cnt();


}


cout << hour << endl;

cout << cheese_numArr[hour-1] << endl;

}


int main() {

problemIn();

solve();

return 0;


 오케이. 이렇게 문제를 풀면 됩니다. 기르고 포문이 많아서 걱정되긴 하는데, 포문에 따른 다른 연산은 적으므로 크게 상관하지 않아도 됩니다. 그리고 코드 수를 일단 줄이는 것을 생각하는 것도 좋습니다. 너무 꼬인 코드만 짜지 않으면 통과되므로 걱정 하지 않도록 합니다.


그리고 명확하고 간결한 아이디어를 구현하는 것이 첫번째 입니다. 그리고 재사용할떄 리셋을 어느부분에 넣어주어야 하는지도 파악하도록 하는 것이 중요합니다. 오께이. 그리고 문제를 잘 읽고 이것이 예외처리이지만 푸는 사람에게 편리하도록 제공되는 정보도 있으니 이것을 캐치하도록 합니다. 오꼐이.