반응형
개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.
문제
난이도: 골드 4
사용언어: JAVA
풀이
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 | import java.io.*; import java.util.*; class Main { static int[][][] tornado = {{{-2, 0}, {-1, -1}, {-1, 0}, {-1, 1}, {0, -2}, {1, -1}, {1, 0}, {1, 1}, {2, 0}, {0, -1}}, {{0, -2}, {1, -1}, {0, -1}, {-1, -1}, {2, 0}, {1, 1}, {0, 1}, {-1, 1}, {0, 2}, {1, 0}}, {{-2, 0}, {-1, 1}, {-1, 0}, {-1, -1}, {0, 2}, {1, 1}, {1, 0}, {1, -1}, {2, 0}, {0, 1}}, {{0, 2}, {-1, 1}, {0, 1}, {1, 1}, {-2, 0}, {-1, -1}, {0, -1}, {1, -1}, {0, -2}, {-1, 0}} }; // 각 방향별 흩어지는 위치 static int[][] dir = {{0, -1}, {1, 0}, {0, 1}, {-1, 0}}; // 이동 방향 static int[] percent = {2, 10, 7, 1, 5, 10, 7, 1, 2}; // 각 위치 별 모래가 흩어지는 비율 static int[][] arr; static int N; static int x, y; static int out = 0; // 밖으로 나가는 모래의 총량 public static void move(int d) { int nx, ny; int sand = 0; for (int i = 0; i < 9; i++) { nx = x + tornado[d][i][0]; ny = y + tornado[d][i][1]; // 모래가 흩어질 위치 지정 if (nx < 0 || nx >= N || ny < 0 || ny >= N) { // 격자의 밖으로 나가는 부분 out += arr[x][y] * (percent[i] * 0.01); // out 변수에 합산 } else { arr[nx][ny] += arr[x][y] * (percent[i] * 0.01); // 격자의 내부라면 해당 위치에 값 합산 } sand += arr[x][y] * (percent[i] * 0.01); // 각각의 위치에 흩어진 모래의 양 계산 } nx = x + tornado[d][9][0]; ny = y + tornado[d][9][1]; // 알파 값에 해당하는 위치 if (nx < 0 || nx >= N || ny < 0 || ny >= N) { out += arr[x][y] - sand; // 해당 위치가 격자 밖이라면 out 변수에 합산. 알파에는 다른 곳에 뿌려진 모래를 제외한 나머지 모래가 모두 합산됨. } else { arr[nx][ny] += arr[x][y] - sand; // 격자 내부라면 알파 위치에 값 합산 } arr[x][y] = 0; // 기존의 위치를 0 } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st; N = Integer.parseInt(br.readLine()); arr = new int[N][N]; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < N; j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } x = N / 2; y = N / 2; // 격자의 가운데에서 시작 int times = 0; int dist = 1; int d = 0; while (x != 0 || y != 0) { for (int i = 0; i < dist; i++) { x += dir[d][0]; y += dir[d][1]; // 좌표를 토네이도 방향으로 이동 move(d); // 모래 흩어지는 것 구현 if (x == 0 && y == 0) // 좌측 상단에 도달하면 종료 break; } times++; if (times == 2) { dist++; times = 0; } d = d + 1 == 4 ? 0 : d + 1; // 방향 조절 } bw.write(String.valueOf(out) + "\n"); bw.flush(); bw.close(); br.close(); } } | cs |
반응형
'백준 온라인 저지 > Gold' 카테고리의 다른 글
[BOJ] 1584 - 게임 (0) | 2021.04.19 |
---|---|
[BOJ] 20159 - 동작 그만. 밑장 빼기냐? (4) | 2021.04.18 |
[BOJ] 14891 - 톱니바퀴 (0) | 2021.04.11 |
[BOJ] 14499 - 주사위 굴리기 (0) | 2021.04.05 |
[BOJ] 6593 - 상범 빌딩 (0) | 2021.03.23 |