ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 미세먼지 안녕!
    백준알고리즘 2019. 7. 28. 23:40
    #include<cstdio>
    #include<iostream>
    #include<utility>
    #include<vector>
    
    using namespace std;
    
    int r, c, t;
    int map[2][50][50];// 먼지 오리지날 0, 퍼진상태 1, 나머지 2차원맵
    int dx[] = { 0,0,1,-1 };
    int dy[] = { 1,-1,0,0 };
    vector<pair<int, int>> v;
    
    void bfs(int x, int y) {//bfs인줄 알았으나.. 그냥 한칸씩만 옮기면되서 먼지움직임제어
    	int re = map[0][x][y] / 5;
    	int cnt = 0;
    	for (int i = 0; i < 4; i++) {
    		int nx = x + dx[i]; int ny = y + dy[i];
    		if (nx >= 0 && nx < r && ny >= 0 && ny < c) {
    			if (map[0][nx][ny] != -1) {
    				map[1][nx][ny] += re;
    				cnt++;
    			}
    		}
    	}
    	map[0][x][y] = map[0][x][y] - re * cnt;
    }
    
    void go() {//공기 청정기 움직임 제어
    	int x = v[0].first; int y = v[0].second;
    	vector<int> p;
    	for (int i = x - 1; i >= 0; i--) {
    		if(map[0][i+1][0] != -1) map[0][i + 1][0] = map[0][i][0];
    	}
    	for (int i = 1; i < c; i++) {
    		map[0][0][i - 1] = map[0][0][i];
    	}
    	for (int i = 0; i < x; i++) {
    		map[0][i][c-1] = map[0][i+1][c-1];
    	}
    	for (int i = c - 2; i >= 0; i--) {
    		if (map[0][x][i] != -1) {
    			map[0][x][i + 1] = map[0][x][i];
    		}
    		else map[0][x][i + 1] = 0;
    	}
    	x = v[1].first; y = v[1].second;
    	for (int i = x - 1; i < r; i++) {
    		if (map[0][i][0] != -1) map[0][i][0] = map[0][i + 1][0];
    	}
    	for (int i = 1; i < c; i++) {
    		map[0][r - 1][i - 1] = map[0][r - 1][i];
    	}
    	for (int i = r - 1; i > x; i--) {
    		map[0][i][c - 1] = map[0][i-1][c - 1];
    	}
    	for (int i = c - 2; i >= 0; i--) {
    		if (map[0][x][i] != -1) {
    			map[0][x][i + 1] = map[0][x][i];
    		}
    		else map[0][x][i + 1] = 0;
    	}
    	
    }
    
    int main() {
    	cin >> r >> c >> t;
    	
    	for (int i = 0; i < r; i++) {
    		for (int j = 0; j < c; j++) {
    			cin >> map[0][i][j];
    			if (map[0][i][j] == -1) {
    				v.push_back(make_pair(i, j));
    			}
    		}
    	}
    	while (t--) {
    		for (int i = 0; i < r; i++) {
    			for (int j = 0; j < c; j++) {
    				bfs(i, j);//미세먼지 하나하나 다 퍼트리고
    			}
    		}
    		for (int i = 0; i < r; i++) {
    			for (int j = 0; j < c; j++) {
    				map[0][i][j] = map[0][i][j] + map[1][i][j];//퍼트린거 합친다음에
    			}
    		}
    
    		go();//공기 청정기 슈웅
    		
    		for (int i = 0; i < r; i++) {
    			for (int j = 0; j < c; j++) {
    				map[1][i][j] = 0;//다했으면, 퍼트리는 임시 맵 초기화
    			}
    		}
    	}
    	int answer = 0;
    	for (int i = 0; i < r; i++) {
    		for (int j = 0; j < c; j++) {
    			answer += map[0][i][j];//먼지값 합치기 어차피 나머지는 0 청정기 -1
    		}
    	}
    	answer += 2;//공기청정기 -1 2개니까 +2해주고
    	printf("%d\n", answer);//답내기
    	return 0;
    }

    시뮬레이션이라고 해야되나? 어려운문제는 확실히 아니였고, 입사 문제 였다는데, 상당히 쉬웠던거같음

    '백준알고리즘' 카테고리의 다른 글

    N-Queen  (0) 2019.07.30
    부등호  (0) 2019.07.30
    로또  (0) 2019.07.23
    일곱난쟁이  (0) 2019.07.23
    잉카달력  (0) 2019.07.21

    댓글

Designed by Tistory.