https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRJ8EKe48DFAUo&
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
1.
Data클래스는 value와 time을 가지고 있다
초기는 2, 2*2 이런 식
그래서 1초마다 도는데
새 배열을 +2 +2 상하좌우 늘려주고
거기에 0,0으로 채우고
원래 것을 조사하는데
1.time이 value보다 크면 대기상태이므로 time만 감소해 주고 새배열 넣기
2.time이 0보다 크면 살아 있으므로 time감소하고 새배열 넣고 번식해 주기
3. 모서리면 무조건 번식, value가 0인곳이면 안 간 곳이어서 번식
+ 뭐가 있어 근데 내가 더 크면 번식
근데 시간 초과 남
실제로 칸이 안 늘어났으면 줄여야 한다 그래야 시간초과 피함
import java.io.*;
import java.util.*;
class Data {
int value;
int time;
Data(int value, int time) {
this.value = value;
this.time = time;
}
}
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for (int test_case = 1; test_case <= T; test_case++) {
int N, M, K;
Data[][] arr;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
arr = new Data[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
int value = Integer.parseInt(st.nextToken());
arr[i][j] = new Data(value, value * 2);
}
}
//////////////////////////////////////////////////////////
int time = 0;
while (time < K) {
Data[][] new_arr = new Data[arr.length + 2][arr[0].length + 2];
for (int i = 0; i < new_arr.length; i++) {
for (int j = 0; j < new_arr[0].length; j++) {
new_arr[i][j] = new Data(0, 0);
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
// 아무것도 없는 곳
if (arr[i][j].value == 0) {
}
// 뭔가 있어
else {
// 대기 상태 인거
if (arr[i][j].time > arr[i][j].value) {
arr[i][j].time--;
new_arr[i + 1][j + 1] = arr[i][j];
}
// 살아 있는 거
else if (arr[i][j].time > 0) {
arr[i][j].time--;
new_arr[i + 1][j + 1] = arr[i][j];
// 위로 번식
if (i == 0 || arr[i - 1][j].value == 0) {
if (arr[i][j].value > new_arr[i + 1 - 1][j + 1].value)
new_arr[i + 1 - 1][j + 1] = new Data(arr[i][j].value, arr[i][j].value * 2);
}
// 아래로 번식
if (i == arr.length - 1 || arr[i + 1][j].value == 0) {
if (arr[i][j].value > new_arr[i + 1 + 1][j + 1].value)
new_arr[i + 1 + 1][j + 1] = new Data(arr[i][j].value, arr[i][j].value * 2);
}
// 왼쪽으로 번식
if (j == 0 || arr[i][j - 1].value == 0) {
if (arr[i][j].value > new_arr[i + 1][j + 1 - 1].value)
new_arr[i + 1][j + 1 - 1] = new Data(arr[i][j].value, arr[i][j].value * 2);
}
// 오른쪽으로 번식
if (j == arr[0].length - 1 || arr[i][j + 1].value == 0) {
if (arr[i][j].value > new_arr[i + 1][j + 1 + 1].value)
new_arr[i + 1][j + 1 + 1] = new Data(arr[i][j].value, arr[i][j].value * 2);
}
}
// 죽은 거
else {
new_arr[i + 1][j + 1] = arr[i][j];
}
}
}
}
arr = new_arr;
arr = func1(arr);
arr = func2(arr);
arr = func3(arr);
arr = func4(arr);
time++;
}
int answer = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if (arr[i][j].time > 0)
answer++;
}
}
sb.append("#").append(test_case).append(" ").append(answer).append("\n");
}
System.out.println(sb);
}
public static Data[][] func1(Data[][] arr) {
boolean can;
Data[][] new_arr = null;
can = true;
for (int i = 0; i < arr.length; i++) {
if (arr[i][0].value != 0)
can = false;
}
if (can) {
new_arr = new Data[arr.length][arr[0].length - 1];
for (int i = 0; i < new_arr.length; i++) {
for (int j = 0; j < new_arr[0].length; j++) {
new_arr[i][j] = arr[i][j + 1];
}
}
return new_arr;
}
return arr;
}
public static Data[][] func2(Data[][] arr) {
boolean can;
Data[][] new_arr = null;
can = true;
for (int j = 0; j < arr[0].length; j++) {
if (arr[0][j].value != 0)
can = false;
}
if (can) {
new_arr = new Data[arr.length-1][arr[0].length];
for (int i = 0; i < new_arr.length; i++) {
for (int j = 0; j < new_arr[0].length; j++) {
new_arr[i][j] = arr[i+1][j];
}
}
return new_arr;
}
return arr;
}
public static Data[][] func3(Data[][] arr) {
boolean can;
Data[][] new_arr = null;
can = true;
for (int i = 0; i < arr.length; i++) {
if (arr[i][arr[0].length-1].value != 0)
can = false;
}
if (can) {
new_arr = new Data[arr.length][arr[0].length - 1];
for (int i = 0; i < new_arr.length; i++) {
for (int j = 0; j < new_arr[0].length; j++) {
new_arr[i][j] = arr[i][j];
}
}
return new_arr;
}
return arr;
}
public static Data[][] func4(Data[][] arr) {
boolean can;
Data[][] new_arr = null;
can = true;
for (int j = 0; j < arr[0].length; j++) {
if (arr[arr.length-1][j].value != 0)
can = false;
}
if (can) {
new_arr = new Data[arr.length-1][arr[0].length];
for (int i = 0; i < new_arr.length; i++) {
for (int j = 0; j < new_arr[0].length; j++) {
new_arr[i][j] = arr[i][j];
}
}
return new_arr;
}
return arr;
}
}