https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제
입력
출력
소스코드
import java.util.*;
import java.io.*;
class Main {
static int n; //셀의 개수
static int m; //격리 시간
static int k; //미생물 군집의 개수
static Node[][] arr;
static class Node {
int di; //방향 (상: 1, 하: 2, 좌: 3, 우: 4)
int size; //개수
public Node(int di, int size) {
this.di = di;
this.size = size;
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
arr = new Node[n][n];
for (int j = 0; j < k; j++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int size = Integer.parseInt(st.nextToken());
int di = Integer.parseInt(st.nextToken());
arr[x][y] = new Node(di, size);
}
for (int j = 0; j < m; j++) move();
long result = 0;
for (int j = 0; j < n; j++) {
for (int l = 0; l < n; l++) {
if (arr[j][l] != null) {
result += arr[j][l].size;
}
}
}
sb.append("#" + (i + 1) + " " + result + "\n");
}
System.out.println(sb);
}
static int[] rx = {0, -1, 1, 0, 0};
static int[] ry = {0, 0, 0, -1, 1};
//미생물 이동
static void move() {
Node[][] moveArr = new Node[n][n];
int[][] sizeArr = new int[n][n]; //영역별 미생물 개수
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr[i][j] != null) {
Node curNode = arr[i][j];
int nx = i + rx[curNode.di];
int ny = j + ry[curNode.di];
//약품 영역
if (nx <= 0 || ny <= 0 || nx >= n - 1 || ny >= n - 1) {
curNode.size /= 2;
if (curNode.size == 0) continue;
if (curNode.di % 2 == 0) curNode.di -= 1;
else curNode.di += 1;
}
//미생물 합치기
if (moveArr[nx][ny] != null) {
//현재 미생물의 군집이 더 큰 경우
if (moveArr[nx][ny].size < curNode.size) {
moveArr[nx][ny].di = curNode.di;
moveArr[nx][ny].size = curNode.size;
}
} else moveArr[nx][ny] = curNode;
sizeArr[nx][ny] += curNode.size;
}
}
}
//영역별 미생물 개수 갱신
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(moveArr[i][j] != null) {
moveArr[i][j].size = sizeArr[i][j];
}
}
}
arr = moveArr;
}
}
해결 방법
1. 군집 내 미생물의 수, 이동 방향을 저장하는 Node 클래스를 생성하였다.
2. 이동을 위한 move()를 작성하였고 약품 영역, 미생물 합치기와 같은 조건을 해결했다. 이때, 미생물이 있는 arr[][]과는 별개로 이동한 미생물을 저장하는 moveArr[][]을 두었다. 이렇게 해야 이미 이동한 미생물임을 판단할 수 있다.
3. 주의 사항으로 3개 이상의 군집이 한 영역으로 오는 경우 가장 수가 많은 군집의 방향으로 설정하기 위해 미생물 합계는 따로 sizeArr[][]을 두어 관리하였다.
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA] 1284번 : 수도 요금 경쟁 (1) | 2023.11.16 |
---|---|
[SWEA] 1952번 : 수영장 (1) | 2023.11.16 |
[SWEA] 7272번 : 안경이 없어! (0) | 2023.11.10 |
[SWEA] 2105번 : 디저트 카페 (0) | 2023.11.09 |
[SWEA] 1953번 : 탈주범 검거 (0) | 2023.11.08 |