728x90
설명이 잘되어 있는 말 그대로 주어진 순서에 맞게 해결하면 되는 시뮬레이션 문제이다.
골드 5 난이도로 삼성 역량 테스트 중에는 쉬운 난이도라고 볼 수 있다.
이 문제는 쉬운 문제이기때문에 함수를 구현해 각각의 함수가 잘 돌아가는지 테스트 겸 풀어도 좋을 것 같다.
문제 풀이
- 미세먼지 확산을 위한 추가의 visit[][]이차원 배열을 선언하고 확산시킨다. 이때 몇 번 확산시킬 수 있는지 세어줘야 현재의 남은 미세먼지도 정할 수 있다.
- 확산이 끝나면 다시 map에 이동 시켜준다.
- 공기청정기를 기준으로 위쪽, 아래쪽 따로 분리해서 계산해준다.
- 시간이 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 |