본문 바로가기

삼성 역량테스트 문제

백준 17144 <미세먼지 안녕!>

728x90

설명이 잘되어 있는 말 그대로 주어진 순서에 맞게 해결하면 되는 시뮬레이션 문제이다.

골드 5 난이도로 삼성 역량 테스트 중에는 쉬운 난이도라고 볼 수 있다.

 

이 문제는 쉬운 문제이기때문에 함수를 구현해 각각의 함수가 잘 돌아가는지 테스트 겸 풀어도 좋을 것 같다.

 

문제 풀이 

 

  1. 미세먼지 확산을 위한 추가의 visit[][]이차원 배열을 선언하고 확산시킨다. 이때 몇 번 확산시킬 수 있는지 세어줘야 현재의 남은 미세먼지도 정할 수 있다.
  2. 확산이 끝나면 다시 map에 이동 시켜준다.
  3. 공기청정기를 기준으로 위쪽, 아래쪽 따로 분리해서 계산해준다.
  4. 시간이 t가 지나면 남아있는 map의 미세먼지 수를 계산해주면 끝!

확산을 시켜주는 단계이다.

 

그 후 다시 map에 옮겨준다.

 

위 쪽을 먼저 순서대로 계산해준다.

 

마찬가지로 아래쪽도 순서대로 계산한다.

 

공기가 순환을 하면서 공기청정기에게 먹히는 지점을 시작으로 해서 회전을 하게 되면 식을 간단하게 구할 수 있다!!

 

전체 코드

더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	static int map[][], r, c, t, dir[][] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } }, wind[];

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		r = Integer.parseInt(st.nextToken());
		c = Integer.parseInt(st.nextToken());
		t = Integer.parseInt(st.nextToken());
		map = new int[r][c];
		int k = 0;
		wind = new int[2];
		for (int i = 0; i < r; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < c; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if (map[i][j] == -1) {
					wind[k++] = i;
				}
			}
		}
		simul();
		int result = 0;
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if (map[i][j] > 0) {
					result += map[i][j];
				}

			}
		}
		System.out.println(result);

	}

	private static void simul() {
		// TODO Auto-generated method stub
		for (int time = 0; time < t; time++) {
			int visit[][] = new int[r][c];
			// 확산부터
			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c; j++) {
					if (map[i][j] >= 5) {
						int count = 0;
						for (int d = 0; d < 4; d++) {
							int x = i + dir[d][0];
							int y = j + dir[d][1];
							if (x < 0 || x >= r || y < 0 || y >= c || map[x][y] == -1) {
								continue;
							}
							visit[x][y] += (map[i][j] / 5);
							count++;
						}
						visit[i][j] += (map[i][j] - map[i][j] / 5 * count);
					} else {
						visit[i][j] += map[i][j];
					}

				}
			} // 확산완료
			for (int i = 0; i < r; i++) {
				for (int j = 0; j < c; j++) {
					map[i][j] = visit[i][j];

				}
			} // 옮겨담기
			up();
			down();

		}

	}

	private static void down() {
		// TODO Auto-generated method stub
		for (int i = wind[1] + 1; i < r - 1; i++) {
			map[i][0] = map[i + 1][0];
		} // 왼쪽
		for (int i = 1; i < c; i++) {
			map[r - 1][i - 1] = map[r - 1][i];
		} // 아래
		for (int i = r - 2; i >= wind[1]; i--) {
			map[i + 1][c - 1] = map[i][c - 1];
		} // 오른쪽
		for (int i = c - 2; i > 0; i--) {
			map[wind[1]][i + 1] = map[wind[1]][i];
		} // 위쪽
		map[wind[1]][1] = 0;

	}

	private static void up() {
		// TODO Auto-generated method stub
		for (int i = wind[0] - 2; i >= 0; i--) {
			map[i + 1][0] = map[i][0];
		} // 왼쪽
		for (int i = 1; i < c; i++) {
			map[0][i - 1] = map[0][i];
		} // 위쪽
		for (int i = 1; i <= wind[0]; i++) {
			map[i - 1][c - 1] = map[i][c - 1];
		} // 오른쪽
		for (int i = c - 2; i > 0; i--) {
			map[wind[0]][i + 1] = map[wind[0]][i];
		} // 아래
		map[wind[0]][1] = 0;
	}

}

 

 

 

 

'삼성 역량테스트 문제' 카테고리의 다른 글

백준 17135 <캐슬 디펜스>  (0) 2020.10.18
백준 19236 <청소년 상어>  (0) 2020.10.14
백준 16235번 <나무 재테크>  (0) 2020.09.15
백준 17780 <새로운 게임>  (0) 2020.09.14
swea 2105 <디저트 카페>  (0) 2020.09.07