반응형
풀이
단계별로 구현해주었습니다.
조건이 까다롭지도 않고 차근차근 읽어보면서 풀어보시는게 좋을거같아요.
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 |