CS/Algorithm

[BOJ][JAVA] 12100 2048(EASY)

별토끼. 2019. 12. 29. 19:27
반응형
문제

https://www.acmicpc.net/problem/12100

 

12100번: 2048 (Easy)

첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2보다 크거나 같고, 1024보다 작거나 같은 2의 제곱꼴이다. 블록은 적어도 하나 주어진다.

www.acmicpc.net

풀이

처음에 문제를 읽었을 때는 어렵게 느껴졌는데, 순서를 쪼개어 생각하니 해결할 수 있었다. 쪼개어서 생각하는 버릇을 길러야겠다!

0. 최대 5번 움직이기가 가능

  최대 5번을 움직여야하기 때문에 DFS를 이용하여 종료조건을 걸어주었다. 그리고 상하좌우 4개의 케이스를 나누어 다음 턴으로 넘어갈 수 있도록 하였다.

1. 네 방향 움직이기

 2048은 네 방향으로 움직일 수 있다. 네 방향으로 움직여 같은 수를 더해야 하므로, 배열을 한쪽 방향으로 몰아놔야 한다. 방향마다 스택에 넣는 순서를 다르게 하여 0을 제외한 값들을 줄마다 넣었다.

2. 같은 값 더하기

 스택에 들어간 값들을 빼내어 map2에 입력할 때   pop한 값과 peek값이 같으면 하나의 값으로 입력하고, 그렇지 않을 경우는 pop한 값만 입력하였다. 

3. max값 구하기

 map2에 입력할 때 max값을 체크해주었다. 

코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	
	static int n;
	static int max=0;
	public static void dfs(int cnt, int[][] map) {
		if(cnt==5) {
			return;
		}
		int[][] map2 = new int[n][n];
		//상
		for(int i=0;i<n;i++) {
			Stack<Integer> s = new Stack<>();
			for(int j=n-1;j>=0;j--) {
				if(map[j][i]==0) continue;
				s.add(map[j][i]);
			}
			int idx = 0;
			while(!s.isEmpty()) {
				int t = s.pop();
				if(s.size()>0 && t==s.peek()) {
					map2[idx][i]=2*t;
					s.pop();
					if(max<2*t) max=2*t; 
				}else {
					map2[idx][i]=t;
					if(max<t) max=t;
				}
				idx++;
			}
		}
		dfs(cnt+1,map2);
		
		//하
		map2 = new int[n][n];
		for(int i=0;i<n;i++) {
			Stack<Integer> s = new Stack<>();
			for(int j=0;j<n;j++) {
				if(map[j][i]==0) continue;
				s.add(map[j][i]);
			}
			int idx = n-1;
			while(!s.isEmpty()) {
				int t = s.pop();
				if(s.size()>0 && t==s.peek()) {
					map2[idx][i]=2*t;
					s.pop();
					if(max<2*t) max=2*t; 
				}else {
					map2[idx][i]=t;
					if(max<t) max=t;
				}
				idx--;
			}
		}
		dfs(cnt+1,map2);
		
		//좌
		map2 = new int[n][n];
		for(int i=0;i<n;i++) {
			Stack<Integer> s = new Stack<>();
			for(int j=n-1;j>=0;j--) {
				if(map[i][j]==0) continue;
				s.add(map[i][j]);
			}
			int idx = 0;
			while(!s.isEmpty()) {
				int t = s.pop();
				if(s.size()>0 && t==s.peek()) {
					map2[i][idx]=2*t;
					s.pop();
					if(max<2*t) max=2*t; 
				}else {
					map2[i][idx]=t;
					if(max<t) max=t;
				}
				idx++;
			}
		}
		dfs(cnt+1,map2);
		
		//우
		map2 = new int[n][n];
		for(int i=0;i<n;i++) {
			Stack<Integer> s = new Stack<>();
			for(int j=0;j<n;j++) {
				if(map[i][j]==0) continue;
				s.add(map[i][j]);
			}
			int idx = n-1;
			while(!s.isEmpty()) {
				int t = s.pop();
				if(s.size()>0 && t==s.peek()) {
					map2[i][idx]=2*t;
					s.pop();
					if(max<2*t) max=2*t; 
				}else {
					map2[i][idx]=t;
					if(max<t) max=t;
				}
				idx--;
			}
		}
		dfs(cnt+1,map2);		
		
	}
	public static void main(String[] args) throws IOException, NumberFormatException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(),"");
		n = Integer.parseInt(st.nextToken());
		int[][] map = new int[n][n];
		for(int i=0;i<n;i++) {
			st = new StringTokenizer(br.readLine()," ");
			int idx = 0;
			while(st.hasMoreTokens()) {
				map[i][idx] = Integer.parseInt(st.nextToken());
				idx+=1;
			}
		}
		dfs(0,map);
		System.out.println(max);
	}
}
반응형