요청사항에 따라 구현하였다.
구현 중에 주의해야할 부분은 구름은 경계를 넘나들어서 나머지 연산을 이용하여 올바르게 값을 넣어주어야하고.
바로 직전에 구름이 있던 자리엔 구름이 생기면 안 되기에 이 점도 유의해줘야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | import java.io.*; import java.util.*; class Main { static int N; static int[][] map; static ArrayList<Dot> cloud;//, ↙ ←, ↖, ↑, ↗, →, ↘, ↓ static int[][] dirs = {{1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}, {0, 1},{1, 1}, {1, 0}}; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); int 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++) { int cur = Integer.parseInt(st.nextToken()); map[i][j] = cur; }w } //비구름 최초 위치. cloud = new ArrayList<>(); cloud.add(new Dot(N-1, 0)); cloud.add(new Dot(N-1, 1)); cloud.add(new Dot(N-2, 0)); cloud.add(new Dot(N-2, 1)); while(M-- >0) { st = new StringTokenizer(br.readLine()); int d = Integer.parseInt(st.nextToken()) % 8; int s = Integer.parseInt(st.nextToken()); //구름 이둉 ArrayList<Dot> result = move(d, s); boolean[][] marked = new boolean[N][N]; //구름 칸 비 내리기 + 1 for(Dot dot : result) { map[dot.row][dot.col] += 1; marked[dot.row][dot.col] = true; } //구름 칸에 물복사버그 : 대각선 방향으로 거리가 1인 칸에 물이 있는 바구니의 수 만큼 바구니의 물 양이 증가. 대각선 원형이 아니다. for(Dot dot : result) { int[] dirction = {0, 2, 4, 6}; for(int i = 0; i < 4; i++) { int curD = dirction[i]; int nextR = dot.row + dirs[curD][0]; int nextC = dot.col + dirs[curD][1]; if(nextR< 0 || nextC < 0 || nextR >= N || nextC >= N) continue; if(map[nextR][nextC] > 0) map[dot.row][dot.col]++; } } //구름 찾기. cloud = new ArrayList<>(); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if(map[i][j] < 2) continue; if(marked[i][j]) continue; marked[i][j] = true; cloud.add(new Dot(i, j)); map[i][j] -= 2; } } } int answer = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { answer += map[i][j]; } } System.out.println(answer); } public static ArrayList<Dot> move(int d, int s) { ArrayList<Dot> result = new ArrayList<>(); for(Dot cur : cloud) { int nextR = cur.row + dirs[d][0]*s; int nextC = cur.col + dirs[d][1]*s; nextR = (nextR + 100*N) % N; nextC = (nextC + 100*N) % N; result.add(new Dot(nextR, nextC)); } return result; } } class Dot{ int row; int col; Dot(int r, int c){ this.row = r; this.col = c; } } | cs |
반응형
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[backjoon]3055 탈출 java (0) | 2021.10.06 |
---|---|
[backjoon]16927 배열돌리기2 java (0) | 2021.10.05 |
[backjoon]16236 아기상어 java (0) | 2021.09.30 |
[backjoon]16234 인구 이동 java (0) | 2021.09.26 |
[backjoon]12100 2048(easy) java (0) | 2021.09.15 |