어흥

[SWEA 6109] 추억의 2048게임 (JAVA) 본문

알고리즘/SWEA

[SWEA 6109] 추억의 2048게임 (JAVA)

라이언납시오 2020. 4. 29. 16:57
728x90
반응형

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWbrg9uabZsDFAWQ

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

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
반응형
Comments