풀이
단계별로 구현해주었습니다.
조건이 까다롭지도 않고 차근차근 읽어보면서 풀어보시는게 좋을거같아요.
1) 처음 구름에 위치는 고정되었으므로 cloud큐에 넣어주고
2) 구름을 옮겨주는 단계에서 오류가 발생하긴 했는데,
처음엔 s만큼 전부 도는 시간을 줄이려고 s/N을 해줬는데 대각선에서 틀리더라구요 그래서 s만큼 for문 돌렸습니다.
3) 대각선에 해당하는 1,3,5,7 에 해당하는 x,y를 탐색해주어서 0이 아니면 +1 씩 해주고
4) 다시 구름을 만들었을때 구름이 있던 장소를 담아두었던 check에서 false인 값과 && 2 이상인 것들만 담았습니다.
import java.io.*;
import java.util.*;
public class Main {
static int[] dx = {0,-1,-1,-1,0,1,1,1};
static int[] dy = {-1,-1,0, 1,1,1,0,-1};
static Queue<int[]> cloud = new LinkedList<int[]>();
static int[][] map;
static boolean[][] check;
static int N,M, dir,s;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine()," ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][N];
for(int i =0 ; i<N ; i++) {
st = new StringTokenizer(br.readLine()," ");
for(int j = 0 ; j<N ; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
cloud.add(new int[]{N-1, 0});
cloud.add(new int[]{N-1, 1});
cloud.add(new int[]{N-2, 0});
cloud.add(new int[]{N-2, 1});
for(int i = 0 ; i<M ; i ++) {
check = new boolean[N][N];
st = new StringTokenizer(br.readLine()," ");
dir = Integer.parseInt(st.nextToken()) - 1;
s = Integer.parseInt(st.nextToken());
// 구름 이동
cloud_move();
// 구름 있던 곳 비 내리기
rain();
// 대각선 비 내리기
cross();
// 구름 만들기
clolud_make();
}
int res = 0;
for(int i = 0 ; i<N ; i++) {
for(int j = 0 ; j<N ; j++) {
res += map[i][j];
}
}
System.out.println(res);
}
private static void clolud_make() {
// TODO Auto-generated method stub
for(int i = 0 ; i<N ; i++) {
for(int j = 0 ; j<N ; j++) {
if(map[i][j] >=2 && check[i][j]==false) {
map[i][j] -= 2;
cloud.add(new int[] {i,j});
}
}
}
}
private static void cross() {
// TODO Auto-generated method stub
int size = cloud.size();
for(int i = 0 ; i<size ; i++) {
int[] cur = cloud.poll();
int x = cur[0];
int y = cur[1];
int cnt = 0;
for(int j=1 ; j<=4 ; j++) {
int nx = x+dx[j*2-1];
int ny = y+dy[j*2-1];
if(0>nx || nx>=N || 0>ny || ny>=N) continue;
if(map[nx][ny] == 0) continue;
cnt ++ ;
}
map[x][y] += cnt;
}
}
private static void rain() {
// TODO Auto-generated method stub
int size = cloud.size();
for(int i = 0 ; i<size ; i++) {
int[] cur = cloud.poll();
check[cur[0]][cur[1]] = true;
map[cur[0]][cur[1]] = map[cur[0]][cur[1]] +1;
cloud.add(new int[] {cur[0], cur[1]});
}
}
private static void cloud_move() {
// TODO Auto-generated method stub
int size = cloud.size();
for(int i = 0 ; i<size ; i++) {
int[] cur = cloud.poll();
int x = cur[0];
int y = cur[1];
for(int j = 0 ; j<s ; j++){
x = x + dx[dir];
y = y + dy[dir];
if(0>x) {
x = N+x;
}
else if(x>=N) {
x = x - N;
}
if(0>y) {
y = N+y;
}
else if(y>=N) {
y = y - N;
}
}
cloud.add(new int[] {x,y});
}
}
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[Java/자바 백준 17143] 낚시왕 (0) | 2021.11.11 |
---|---|
[Java/자바 백준 16235] 나무 재테크 (0) | 2021.11.10 |
[Java/자바 백준 16234] 인구이동 (0) | 2021.11.09 |
[Java/자바 백준 14999] 주사위 굴리기 (0) | 2021.10.29 |
[Java/자바 백준 17140] 이차원 배열과 연산 (0) | 2021.10.17 |