티스토리 뷰
1. 10 X 10 Map에 배터리의 해당 정보를 비트마스크를 이용하여 저장한다.
1) 0번 배터리 : (1 << 0) = 1
2) 1번 배터리 : (1 << 1) = 2
3) 2번 배터리 : (1 << 2) = 4
4) 3번 배터리 : (1 << 3) = 8
즉, Map[row][col]에 10이 저장되어 있다면, 10 = 2 + 8 이므로, 1번, 3번 배터리의 영향을 받는 지역이라고 할 수 있다.
2. 사람 A, B를 옮겨가면서 각 사람마다 해당 위치의 Map[row][col] 값을 확인한다. 비트마스킹 연산을 진행하면서
해당 위치가 어느 배터리의 영향을 받는지 확인하고, List에 배터리 번호를 저장한다.
3. 사람 A, B의 위치에서 영향을 받는 배터리의 정보를 List에 저장했다면 모든 경우의 수를 계산하며 최대값을
찾는다. 경우의 수는 크게 3가지로 나눌 수 있다.
1) A만 배터리 영향을 받을 경우
2) B만 배터리 영향을 받을 경우
3) A, B 모두 배터리 영향을 받을 경우
[소스 코드]
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 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.Stack; import java.util.StringTokenizer; public class Solution { public static int N, tCase, M, A, ans; public static int[][] move, map, persons; public static int[] ap; public static int[] dirX = new int[] { 0, -1, 0, 1, 0 }; public static int[] dirY = new int[] { 0, 0, 1, 0, -1 }; public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws Exception { N = 10; StringTokenizer st = new StringTokenizer(br.readLine()); tCase = Integer.parseInt(st.nextToken()); for (int t = 1; t <= tCase; t++) { st = new StringTokenizer(br.readLine()); M = Integer.parseInt(st.nextToken()); A = Integer.parseInt(st.nextToken()); ans = 0; map = new int[N][N]; move = new int[2][M]; persons = new int[2][2]; ap = new int[A]; persons[0][0] = persons[0][1] = 0; persons[1][0] = persons[1][1] = 9; for (int i = 0; i < 2; i++) { st = new StringTokenizer(br.readLine()); for (int j = 0; j < M; j++) { move[i][j] = Integer.parseInt(st.nextToken()); } } for (int i = 0; i < A; i++) { st = new StringTokenizer(br.readLine()); int col = Integer.parseInt(st.nextToken()); int row = Integer.parseInt(st.nextToken()); int area = Integer.parseInt(st.nextToken()); int power = Integer.parseInt(st.nextToken()); setBattery(row - 1, col - 1, i, area); ap[i] = power; } solve(); for (int i = 0; i < M; i++) { persons[0][0] += dirX[move[0][i]]; persons[0][1] += dirY[move[0][i]]; persons[1][0] += dirX[move[1][i]]; persons[1][1] += dirY[move[1][i]]; solve(); } System.out.println("#" + t + " " + ans); } } public static void solve() { List<List<Integer>> list = new ArrayList<>(); for (int i = 0; i < 2; i++) { int row = persons[i][0]; int col = persons[i][1]; List<Integer> person = new ArrayList<>(); if (map[row][col] > 0) { for (int j = 0; j < A; j++) { if ((map[row][col] & (1 << j)) > 0) { person.add(j); } } } list.add(person); } List<Integer> a = list.get(0); List<Integer> b = list.get(1); int maxVal = 0; if (a.size() == 0 && b.size() > 0) { for (int i = 0; i < b.size(); i++) maxVal = Math.max(maxVal, ap[b.get(i)]); } else if (a.size() > 0 && b.size() == 0) { for (int i = 0; i < a.size(); i++) maxVal = Math.max(maxVal, ap[a.get(i)]); } else if (a.size() > 0 && b.size() > 0) { for (int i = 0; i < a.size(); i++) { for (int j = 0; j < b.size(); j++) { int sum = ap[a.get(i)]; if (a.get(i) != b.get(j)) { sum += ap[b.get(j)]; } maxVal = Math.max(maxVal, sum); } } } ans += maxVal; } public static void setBattery(int startRow, int startCol, int batNum, int area) { boolean[][] visited = new boolean[N][N]; batNum = (1 << batNum); Queue<Node> q = new LinkedList<>(); q.offer(new Node(startRow, startCol, 0)); visited[startRow][startCol] = true; map[startRow][startCol] += batNum; while (!q.isEmpty()) { Node node = q.poll(); int row = node.row; int col = node.col; int cnt = node.cnt; if (cnt >= area) continue; for (int i = 1; i <= 4; i++) { int nr = row + dirX[i]; int nc = col + dirY[i]; if (isBoundary(nr, nc) && !visited[nr][nc]) { visited[nr][nc] = true; map[nr][nc] += batNum; q.offer(new Node(nr, nc, cnt + 1)); } } } } public static boolean isBoundary(int row, int col) { return (row >= 0 && row < N) && (col >= 0 && col < N); } public static void showMap(int[][] map) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { System.out.print(map[i][j] + " "); } System.out.println(); } System.out.println(); } } class Node { int row; int col; int cnt; public Node(int row, int col, int cnt) { this.row = row; this.col = col; this.cnt = cnt; } } | cs |
'알고리즘 문제 > SW Expert Academy' 카테고리의 다른 글
[SWEA 5648번] 원자소멸 시뮬레이션 :: 늦깎이 IT (1) | 2019.03.20 |
---|---|
[SWEA 2105번] 디저트 카페 :: 늦깎이 IT (0) | 2019.03.17 |
[SWEA 5650번] 핀볼 게임 :: 늦깎이 IT (0) | 2019.03.16 |
[SWEA 2112번] 보호 필름 :: 늦깎이 IT (0) | 2019.03.13 |
[SWEA 1949번] 등산로 조성 :: 늦깎이 IT (0) | 2019.03.13 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 우선순위 큐
- 탐색
- 트리
- 시뮬레이션
- 배열
- 백준
- 구현
- BFS
- 최소힙
- 나무 재테크
- 브루트포스
- 알고스팟
- 최대힙
- 자바
- 삼성
- 힙
- 연산자 끼워넣기
- 알고리즘
- 탈주범 검거
- 힙정렬
- 큐
- 영역 구하기
- SWEA
- 중간값
- 리스트
- 구슬 탈출2
- DFS
- 정렬
- 14888
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함