티스토리 뷰
[백준 16235번 나무재테크 URL]
https://www.acmicpc.net/problem/16235
[기본 로직]
1. 1년(봄~겨울)이 지난 후 추가되는 영양분을 저장하는 배열 A를 선언합니다.
2. 각 계절마다 참고(?)해야할 현재의 영양분을 저장하는 배열 map을 선언합니다.
3. 각 위치(row, col)마다 나무의 갯수를 저장하기 위해 List 배열을 선언합니다.
[구체적인 로직]
1. doSpringAndSummer() 메소드
이 메소드에서는 봄, 여름에 일어나는 일을 함께 처리합니다.
각 위치(row, col)마다 저장된 나무를 순회하기 전에 나무의 나이를 기반으로 오름차순으로 정렬한 뒤,
나무의 나이와 그 위치에 있는 영양분을 비교하여 나무의 나이를 +1 증가시킬것인지 죽일것인지 결정합니다.
여기서 기존에 list[row][col]에 저장된 값(나무)은 삭제하지 않고 메소드 내에서 alive라는 List를 선언해,
나이가 증가된 나무들을 따로 저장합니다. "봄"이 끝나면 list[row][col]가 기존의 List가 아닌 새로 만들어진
alive(나이가 증가된 나무들)을 참고하게 합니다.
만약 나무를 죽여야 하는 상황이라면, list에서 삭제하지 않고, 단순히 sum이라는 변수에 값을 저장합니다.
한 칸에 대한 "봄"의 로직을 모두 끝냈다면 sum에 저장된 값(죽은 나무가 변환된 영양분)을
map[row][col]에 더해주는 것이 "여름"에 대한 로직입니다.
2. doFall() 메소드
나무의 나이가 5의 배수이면 인접한 8방향으로 나이가 1인 나무를 추가합니다.
3. doWinter() 메소드
map[][]에 초기 영양분인 A[][]를 더해줍니다.
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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.StringTokenizer; public class Main { static int N, M, K; static int[][] map; static int[][] A; static List<Integer>[][] list; static int[] dirX = new int[] { 0, 0, 1, -1, -1, -1, 1, 1 }; static int[] dirY = new int[] { 1, -1, 0, 0, -1, 1, -1, 1 }; static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; static Comparator<Integer> comparator = new Comparator<Integer>() { public int compare(Integer o1, Integer o2) { return o1 - o2; } }; public static void main(String[] args) throws IOException { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken()); map = new int[N][N]; A = new int[N][N]; list = new ArrayList[N][N]; for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < N; j++) { A[i][j] = Integer.parseInt(st.nextToken()); list[i][j] = new ArrayList<>(); map[i][j] = 5; } } for (int i = 0; i < M; i++) { st = new StringTokenizer(br.readLine()); int row = Integer.parseInt(st.nextToken()) - 1; int col = Integer.parseInt(st.nextToken()) - 1; int age = Integer.parseInt(st.nextToken()); list[row][col].add(age); } for (int i = 0; i < K; i++) { doSpringandSummer(); doFall(); doWinter(); } int ans = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { ans += list[i][j].size(); } } System.out.println(ans); } public static void doSpringandSummer() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { int sum = 0; Collections.sort(list[i][j], comparator); List<Integer> alive = new ArrayList<>(); for (int k = 0; k < list[i][j].size(); k++) { int tree = list[i][j].get(k); if (map[i][j] - tree >= 0) { map[i][j] -= tree; alive.add(tree + 1); } else { sum += (tree / 2); } } list[i][j] = alive; map[i][j] += sum; } } } public static void doFall() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < list[i][j].size(); k++) { int tree = list[i][j].get(k); if (tree % 5 == 0) { for (int dir = 0; dir < 8; dir++) { int row = i + dirX[dir]; int col = j + dirY[dir]; if (isBoundary(row, col)) { list[row][col].add(1); } } } } } } } public static void doWinter() { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { map[i][j] += A[i][j]; } } } public static boolean isBoundary(int row, int col) { return (row >= 0 && row < N) && (col >= 0 && col < N); } } | cs |
'알고리즘 문제 > 백준(BOJ)' 카테고리의 다른 글
[백준 16234번] 인구 이동 :: 늦깎이 IT (0) | 2019.03.07 |
---|---|
[백준 16236번] 아기상어 :: 늦깎이 IT (0) | 2019.03.06 |
[백준 2583번] 영역 구하기_C++ (0) | 2019.02.17 |
[백준 1012번] 유기농 배추 (C, C++) (0) | 2019.02.17 |
[백준 2206번] 벽 부수고 이동하기_JAVA (0) | 2019.02.15 |
- Total
- Today
- Yesterday
- SWEA
- 14888
- 배열
- 우선순위 큐
- 최대힙
- 연산자 끼워넣기
- 영역 구하기
- 나무 재테크
- 정렬
- 시뮬레이션
- 탈주범 검거
- 큐
- 브루트포스
- 알고리즘
- 알고스팟
- DFS
- 트리
- 힙정렬
- 자바
- 탐색
- 리스트
- 백준
- 구슬 탈출2
- 중간값
- 최소힙
- BFS
- 삼성
- 힙
- 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |