[JAVA]백준 17144 미세먼지 안녕!

2 분 소요

JAVA로 풀이했습니다.
출처 : 백준 알고리즘 https://www.acmicpc.net

문제 개요

17144번 문제 👉 https://www.acmicpc.net/problem/17144
미세먼지를 제거하는 공기청정기 시뮬레이션
난이도 👉 골드 5

풀이과정

단순히 시뮬레이션 문제입니다. 문제를 이해하고 이해한 내용을 바탕으로 구현하는 것을 목표로 하였습니다.

나만의 방법

전략으로는 함수 단위로 문제를 구분하여 풀었습니다. 먼저 미세먼지가 확장하는 spread 함수, 공기청정기에서 바람이 부는 함수 blow, 바람이 불면서 미세먼지를 이동시키는 turn 함수로 구성하여 각각의 기능을 구현하였습니다.

spread 함수는 배열의 원소를 queue에 넣습니다.(배열값 -1, 0 제외) 그리고 큐에 들어간 순서대로 탐색하면서 확산하는 과정을 거칩니다. 퍼질수 있으면 함수값/5만큼 퍼지고 퍼질 수 없으면 continue, 그리고 퍼지는 과정을 마치면 퍼진만큼 함수값에서 빼주는 과정을 포함했습니다.

blow함수는 편의상 만들었습니다. blow함수는 공기청정기 작동횟수만큼 공기청정기를 작동시키며, 공기청정기를 윗부분 아랫부분 분리하여 작동합니다.

turn 함수는 시작점으로부터 반시계방향, 시계방향으로 이동시키는 것을 고려하여 코드를 작성하였습니다.

소스코드

public class baek_17144 {
	static int R, C, T, arr[][];
	static int[] dr = { 0, -1, 0, 1, 0, 1, 0, -1 };
	static int[] dc = { 1, 0, -1, 0, 1, 0, -1, 0 };
	static Queue<int[]> queue;

	static void spread() {
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (arr[i][j] != 0 && arr[i][j] != -1) {
					queue.add(new int[] { i, j, arr[i][j] });
				}
			}
		}
		while (!queue.isEmpty()) {
			int[] now = queue.poll();
			int x = now[0];
			int y = now[1];
			int n = now[2];
			int count = 0;
			for (int i = 0; i < 4; i++) {
				int nx = x + dr[i];
				int ny = y + dc[i];
				if (nx < 0 || nx >= R || ny < 0 || ny >= C || arr[nx][ny]==-1) {
					continue;
				}
				count++;
				arr[nx][ny] = arr[nx][ny] + n / 5;
			}
			arr[x][y] = arr[x][y] - count * (n / 5);
		}
	}

	static void blow() {
		for (int i = 0; i < R; i++) {
			if (arr[i][0] == -1) {
				turn(i, 0);
				turn(i + 1, 1);
				break;
			}
		}
	}

	static void turn(int row, int d) {
		int dx = row;
		int dy = 0;
		int now = 0;
		int temp = 0;
		for (int i = d * 4 + 0; i < d * 4 + 4; i++) {
			while (true) {
				dx = dx + dr[i];
				dy = dy + dc[i];

				if (dx < 0 || dx >= R || dy < 0 || dy >= C) {
					dx = dx - dr[i];
					dy = dy - dc[i];
					break;
				}
				if (arr[dx][dy] == -1) {
					break;
				}
				temp = arr[dx][dy];

				arr[dx][dy] = now;
				now = temp;

			}
		}
	}

	static void print() {
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();
	}

	static int sum() {
		int sum = 0;
		for (int i = 0; i < R; i++) {
			for (int j = 0; j < C; j++) {
				if (arr[i][j] == -1) {
					continue;
				}
				sum += arr[i][j];
			}
		}
		return sum;
	}

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		T = Integer.parseInt(st.nextToken());
		arr = new int[R][C];

		for (int i = 0; i < R; i++) {
			st = new StringTokenizer(in.readLine());
			for (int j = 0; j < C; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		for (int i = 0; i < T; i++) {
			queue = new LinkedList<>();
			spread();
			blow();
		}
		System.out.println(sum());
	}
}

태그: ,

카테고리:

업데이트:

댓글남기기