Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 알고리즘 그래프
- jquery 속성선택자
- 순열 재귀
- java lambda
- 재귀
- 자바스크립트 이벤트처리
- str to char array
- 후위표기
- 재귀함수
- jquery dom 계층 선택자
- java 내부 클래스
- char to str
- inner class
- 자바
- 조합 재귀
- 자바 조합 재귀
- jquery 이벤트 처리
- 서로소
- java Collections.sort()
- 자바입출력
- 상속
- 순열코드
- Interface
- 알고리즘
- jquery 필터선택자
- 자바 순열 코드
- 자바스크립트 이벤트중지
- Java
- 자바 재귀 조합
- parseInt()
Archives
- Today
- Total
유블로그
[Java] swea 2382 미생물격리 본문
[Java] swea 2382 미생물격리
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class 모의SW_2382_미생물격리 {
static class Microbe {
int x, y, d, qty;
public Microbe(int x, int y, int qty, int d) {
this.x = x;
this.y = y;
this.qty = qty;
this.d = d;
}
}
static int N, M, K;
static List<Integer>[][] grid;
static Microbe[] micros;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for (int testcase = 1; testcase <= T; testcase++) {
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
micros = new Microbe[K];
grid = new ArrayList[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
grid[i][j] = new ArrayList<>();
}
}
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int qty = Integer.parseInt(st.nextToken());
int d = Integer.parseInt(st.nextToken());
switch(d) {
case 1:
d = 0;
break;
case 4:
d = 1;
break;
}
micros[i] = new Microbe(x, y, qty, d);
}
System.out.println("#" + testcase + " " + solve());
} // tc
} //main
static int[][] dir = new int[][] { {-1, 0},{0, 1},{1, 0},{0, -1} };
private static int solve() {
for (int t = 0; t < M; t++) {
// 미생물 순회
for (int i = 0; i < K; i++) {
if(micros[i].qty == 0) continue;
micros[i].x += dir[micros[i].d][0];
micros[i].y += dir[micros[i].d][1];
if(micros[i].x <= 0 || micros[i].x >= N-1 || micros[i].y <= 0 || micros[i].y >= N-1) {
micros[i].qty /= 2;
if(micros[i].qty > 0)
micros[i].d = (micros[i].d + 2) % 4;
}
else {
grid[micros[i].x][micros[i].y].add(i);
}
}
// grid 순회
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if(grid[i][j].size() > 1) {
int maxIdx = 0, max = 0, sum = 0;
for(int num : grid[i][j]) {
if(max < micros[num].qty) {
max = micros[num].qty;
maxIdx = num;
}
sum += micros[num].qty;
}
micros[maxIdx].qty = sum;
for(int num : grid[i][j]) {
if(num != maxIdx) {
micros[num].qty = 0;
}
}
} // if
grid[i][j].clear();
} // j
} // i
} // t
int cnt = 0;
for (int i = 0; i < K; i++) {
if(micros[i].qty > 0) cnt += micros[i].qty;
}
return cnt;
} // solve
}
문제의 조건을 하나하나 넣으면 된다..
List를 가진 이차원 배열을 만든다.
시간 M 까지 for 문을 돌리는데
모든 미생물을 순회하면서 이동시킨다. 이 때 약품으로 간 애들은 반을 줄이고 방향을 바꾸는데. 0이 된 애들은 continue로 아무 처리도 하지 않는다. 그리고 이동시킨 그 위치에 List 이차원배열에 미생물 번호를 넣어준다.
모든 미생물 순회가 끝나면 List 이차원 배열을 순회한다. size 가 2이상인 것이 있다면 만났다는 뜻이니 그 위치에 있는 미생물 숫자를 다 더한 후 제일 숫자가 큰 애의 미생물 수에 넣어준다. 나머지는 없어진 것이니 0으로 처리한다. 어차피 큰 미생물에 숫자를 넣었으니 방향은 큰 미생물로 자연스럽게 설정된다.
중요한 점! 꼭 grid[i][j].clear()로 list를 비워줘야한다. 다음 미생물 이동에 다시 써야하니까~~!
위의 작업을 M만큼 반복하고 미생물을 순회하면서 수가 0보다 큰 애들을 다 더해주면 된다.
'알고리즘' 카테고리의 다른 글
[Java] swea 1949 등산로조성 (0) | 2021.04.22 |
---|---|
[Java] swea 1952 수영장 (0) | 2021.04.22 |
[Java] swea 1953 탈주범검거 (0) | 2021.04.21 |
[Java] swea 2383 점심식사시간 (0) | 2021.04.21 |
[Java] swea 2477 차량정비소 (0) | 2021.04.21 |