어흥
[SWEA 6109] 추억의 2048게임 (JAVA) 본문
728x90
반응형
문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWbrg9uabZsDFAWQ
1. 주의할 점
- 이미 합쳐진 블록은 합치지 않도록 한다
2. 구현
- Arr[][]와 Dup[][]함수를 이용한다
- Mv(dir) 함수를 통해 각 방향마다 다르게 설정한다
- Check[][] 함수를 이용하여 이미 합쳐진 블록의 경우 합치지 않도록 한다
- 만약 블록이 합쳐지는 경우, Cnt의 값을 변화시키지 않도록 한다
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Solution_d4_6109_추억의2048게임 {
static int arr[][], num, dup[][];
static boolean check[][];
static void mv(int dir) {
if (dir == 0) {
for (int j = 0; j < num; j++) {
int cnt = 0;
for (int i = 0; i < num; i++) {
if (arr[i][j] == 0)
continue;
else {
dup[cnt][j] = arr[i][j];
if (cnt > 0 && dup[cnt - 1][j] == dup[cnt][j] && !check[cnt-1][j]) {
dup[cnt - 1][j] *= 2;
dup[cnt][j] = 0;
check[cnt-1][j]=true;
} else
cnt++;
}
}
}
} else if (dir == 1) {
for(int i=0;i<num;i++) {
int cnt = num-1;
for(int j=num-1;j>=0;j--) {
if(arr[i][j]==0) continue;
else {
dup[i][cnt]=arr[i][j];
if(cnt!=num-1 && dup[i][cnt+1]==dup[i][cnt] && !check[i][cnt+1]) {
dup[i][cnt+1]*=2;
dup[i][cnt]=0;
check[i][cnt+1]=true;
}
else
cnt--;
}
}
}
} else if (dir == 2) {
for (int j = 0; j < num; j++) {
int cnt = num-1;
for (int i = num-1; i >=0; i--) {
if (arr[i][j] == 0) continue;
else {
dup[cnt][j] = arr[i][j];
if (cnt !=num-1 && dup[cnt + 1][j] == dup[cnt][j] && !check[cnt+1][j]) {
dup[cnt + 1][j] *= 2;
dup[cnt][j] = 0;
check[cnt+1][j]=true;
} else
cnt--;
}
}
}
} else if (dir == 3) {
for(int i=0;i<num;i++) {
int cnt = 0;
for(int j=0;j<num;j++) {
if(arr[i][j]==0) continue;
else {
dup[i][cnt]=arr[i][j];
if(cnt!=0 && dup[i][cnt-1]==dup[i][cnt] && !check[i][cnt-1]) {
dup[i][cnt-1]*=2;
dup[i][cnt]=0;
check[i][cnt-1]=true;
}
else
cnt++;
}
}
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int test = Integer.parseInt(br.readLine().trim());
for (int t = 1; t <= test; t++) {
String s = br.readLine();
String str;
int order = 0;
StringTokenizer st = new StringTokenizer(s);
num = Integer.parseInt(st.nextToken());
str = st.nextToken();
if (str.equals("up"))
order = 0;
else if (str.equals("right"))
order = 1;
else if (str.equals("down"))
order = 2;
else if (str.equals("left"))
order = 3;
arr = new int[num][num];
dup = new int[num][num];
check = new boolean[num][num];
for(int i=0;i<num;i++) {
s = br.readLine();
st = new StringTokenizer(s);
for(int j=0;j<num;j++)
arr[i][j] = Integer.parseInt(st.nextToken());
}
mv(order);
System.out.println("#"+t);
for(int i=0;i<num;i++) {
for(int j=0;j<num;j++)
System.out.print(dup[i][j]+" ");
System.out.println();
}
}
}
}
728x90
반응형
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA 2112] 보호 필름 (C++) (0) | 2020.05.08 |
---|---|
[SWEA 4112] 이상한 피라미드 탐험 (C++) (0) | 2020.05.01 |
[SWEA 4050] 재관이의 대량 할인 (JAVA) (0) | 2020.04.29 |
[SWEA 5658] 보물상자 비밀번호 (Java) (0) | 2020.04.29 |
[SWEA 1767] 프로세서 연결하기 (C++) (0) | 2020.04.26 |
Comments