๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[BOJ] 12100 2048(Easy) - Java

category Algorithm/BOJ 2022. 11. 13. 17:27

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

 

12100๋ฒˆ: 2048 (Easy)

์ฒซ์งธ ์ค„์— ๋ณด๋“œ์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฒŒ์ž„ํŒ์˜ ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ ์นธ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด์™ธ์˜ ๊ฐ’์€ ๋ชจ๋‘ ๋ธ”๋ก์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ธ”๋ก์— ์“ฐ์—ฌ ์žˆ๋Š” ์ˆ˜๋Š” 2

www.acmicpc.net


1. ๋ฌธ์ œ ์š”์•ฝ

2048๊ฒŒ์ž„์˜ ๊ทœ์น™๊ณผ ๊ฐ™๋‹ค. ๋‹ค๋ฅธ ์ ์€ ๋ฐฉํ–ฅ ์ด๋™ ์‹œ ์ƒˆ๋กœ์šด ์ˆซ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

2. ํ’€์ด

dfs + ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ์ด๋‹ค.

dfs๋ฅผ ์‚ฌ์šฉํ•ด์„œ 5ํšŒ๋ฅผ ์›€์ง์˜€์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋ณธ๋‹ค.

4๋ฐฉํ–ฅ ๋ชจ๋‘ ๋”ฐ์ ธ๋ณด๋Š”๋ฐ,

1. save : ์›€์ง์ด๊ธฐ ์ „ map์„ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด์„œ savemap์— ์ €์žฅํ•ด์ค€๋‹ค.

2. move : ์ˆซ์ž๋“ค์„ ์›€์ง์ธ๋‹ค. ์›€์ง์—ฌ์„œ ํ•ฉ์ณ์ง„ ์ˆซ์ž๋“ค์˜ ์œ„์น˜๋Š” visited ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.

3. visitedInit : visited ์ฒ˜๋ฆฌ๋ฅผ ๋ชจ๋‘ false๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€๋‹ค. (๋‹ค์Œ ์›€์ง์ผ ๋•Œ ํ•ฉ์ณ์งˆ ์ˆซ์ž๋“ค์„ ์œ„ํ•ด)

4. restore : 5ํšŒ ์›€์ง์ž„์ด ๋๋‚˜๋ฉด ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ๋„ ๋ด์•ผํ•˜๋ฏ€๋กœ ๋ฐ”๋กœ ์ „์— ์ €์žฅํ•ด๋‘” savemap์„ ๋ถˆ๋Ÿฌ์™€ map์— ๋‹ค์‹œ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•ด์ค€๋‹ค.

 

๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€

1) ์›€์ง์ธ ๋‹ค์Œ์—๋Š” ์ค‘๋ณต ํ•ฉ์ณ์ง์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ฒดํฌํ•œ visited๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์„œ ๋‹ค์Œ ์›€์ง์ž„์—์„œ๋„ ์ˆซ์ž๋“ค์ด ํ•ฉ์ณ์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  => ๋‚ด๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์€ ์ด๊ฒƒ์„ dfs ์ด์ „์— ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ dfs ์ดํ›„์— ํ•ด์ค€ ์ ์ด๋‹ค. ์ƒˆ๋กœ์šด ํ„ด์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ดˆ๊ธฐํ™”๊ฐ€ ์•ˆ๋œ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.

2) ์›€์ง์ด๋Š” ๋ฐฉํ–ฅ๋งˆ๋‹ค ์›€์ง์ž„์„ ์‹œ์ž‘ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค. => ์ƒ(0,0) / ํ•˜(N-1,0) / ์ขŒ(0,0) / ์šฐ(0,N-1) 

  => 4๋ฐฉํ–ฅ ๋ชจ๋‘ (0,0)๋ถ€ํ„ฐ ์›€์ง์ด๊ฒŒ ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.

 

์ฒ˜์Œ์—๋Š” ์›€์ง์ธ ์ˆซ์ž๋“ค์„ ์›๋ณตํ•ด์ค„ ๋•Œ List๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•˜๋‚˜ํ•˜๋‚˜ ์›€์ง์ธ ๋ฐฉํ–ฅ, ์›€์ง์ธ ์ขŒํ‘œ ๋“ฑ๋“ฑ์„ ์ƒ๊ฐํ•ด์ค˜์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ’€๋ฉด์„œ ๋‚˜๋„ ํ—ท๊ฐˆ๋ ธ๊ณ  ๋‚ด ์ฝ”๋“œ๋ฅผ ๋ณธ ์นœ๊ตฌ๋„ ํ—ท๊ฐˆ๋ ค์„œ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ํ–ˆ๋‹ค.

copymap์„ ์“ฐ๋Š”๊ฒŒ ์ข‹์ง€์•Š๊ฒ ๋ƒ๋Š” ์นœ๊ตฌ์˜ ๋ง์— ์‹œ๋„ํ•ด๋ณด์•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ๋„ ํ›จ์”ฌ ์‰ฌ์› ๋‹ค.

map ์›๋ณต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด copymap์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด์ž.

 

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
package a22_11_12;

import java.io.*;
import java.util.*;

public class BOJ_12100_2048Easy2 {

	static boolean[][] visited;
	static int[][] map;
	static int[][][] savemap;
	static int[] dy = {-1,1,0,0};
	static int[] dx = {0,0,-1,1};
	static int N, ans;
	static Queue<Pos> queue = new ArrayDeque<> ();
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		
		map = new int[N][N];
		savemap = new int[5][N][N];
		visited = new boolean[N][N];
		
		for (int i=0; i<N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int j = 0; j<N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		dfs(0);
		System.out.println(ans);
	}
	
	static void dfs(int cnt) {
		if (cnt == 5) {
			check();
			return;
		}
		
		for (int d=0; d<4; d++) {
			save(cnt, d);
			move(d, cnt);
			visitedInit();
			dfs(cnt+1);
			restore(cnt);
		}
	}
	
	static void save(int cnt, int d) {
		// savemap์—  ์ด๋™ ์ „ map์„ ์ €์žฅ
		if (d == 0 || d==2) { // ์ƒ, ์ขŒ : (0,0)์‹œ์ž‘
			for (int i=0; i<N; i++) {
				for (int j=0; j<N; j++) {
					savemap[cnt][i][j] = map[i][j];
					if (map[i][j] != 0) {
						queue.offer(new Pos(i, j, map[i][j]));
					}
				}
			}
		} else if (d==1) { // ํ•˜ : (N-1,0)์‹œ์ž‘
			for (int i=N-1; i>=0; i--) {
				for (int j=0; j<N; j++) {
					savemap[cnt][i][j] = map[i][j];
					if (map[i][j] != 0) {
						queue.offer(new Pos(i, j, map[i][j]));
					}
				}
			}
		} else if (d==3) { // ์šฐ : (0,N-1)์‹œ์ž‘
			for (int i=0; i<N; i++) {
				for (int j=N-1; j>=0; j--) {
					savemap[cnt][i][j] = map[i][j];
					if (map[i][j] != 0) {
						queue.offer(new Pos(i, j, map[i][j]));
					}
				}
			}
		}
	}
	
	static void move(int d, int cnt) {
		
		while (!queue.isEmpty()) {
			Pos cur = queue.poll();
			int ny = cur.y;
			int nx = cur.x;
			int num = cur.num;
			
			while (true) {
				ny += dy[d];
				nx += dx[d];
				if (ny<0 || ny>=N || nx<0 || nx>=N) {
					ny-=dy[d];
					nx-=dx[d];
					break;
				}
				if (map[ny][nx] != 0) break;				
			} //ny, nx๊ฐ€ ์ •ํ•ด์ง
			
			if (!(cur.y == ny && cur.x == nx)) {
				if (map[ny][nx] == 0) {
					map[cur.y][cur.x] = 0;
					map[ny][nx] = num;
				} else if (map[ny][nx] == num) {
					
					if (visited[ny][nx] == false && visited[cur.y][cur.x] == false) { //์ฒ˜์Œ ํ•ฉ์ณ์ง
						map[cur.y][cur.x] = 0;
						map[ny][nx] = num+num;
						visited[ny][nx] = true;
					} else { //์ด์ „์— ์ด๋ฏธ ํ•ฉ์ณ์ง
						map[cur.y][cur.x] = 0;
						ny-=dy[d];
						nx-=dx[d];
						map[ny][nx] = num;
					}
					
				} else if (map[ny][nx] != num) {
					map[cur.y][cur.x] = 0;
					ny-=dy[d];
					nx-=dx[d];
					map[ny][nx] = num;
				}
			}
		}
	}
	
	static void restore(int cnt) {
		//์ด๋™ ํ•œ map์—  ์ด์ „์— ์ €์žฅํ•œ savemap์„ ๋‹ค์‹œ ๋ณต์‚ฌ
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				map[i][j] = savemap[cnt][i][j];
			}
		}
	}
	
	static void visitedInit() {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				visited[i][j] = false;
			}
		}
	}
	
	static void check() {
		int max = 0;
		for (int i=0; i<N; i++) {
			for (int j = 0; j<N; j++) {
				max = Math.max(max, map[i][j]);
			}
		}
		ans = Math.max(max, ans);
	}
	
	static class Pos {
		int y, x, num;
		Pos(int y, int x, int num) {
			this.y = y;
			this.x = x;
			this.num = num;
		}
	}
}

 

4. ์‚ฌ๋‹ด

์ด๊ฑฐ ํ‘ธ๋Š”๋ฐ 3์ผ ๊ฑธ๋ ธ๋‹ค ๋‚œ ๋Œ€์ฒด ์–ธ์ œ ๋А๋Š”๊ฑธ๊นŒ? ์ œ๋ฐœ ๋Š˜๊ณ ์žˆ๋Š” ์ค‘์ด๊ธธ ^_ใ… 

์ฝ”ํ…Œ์— ๋‚˜์˜ค๋ฉด ๊ทธ ์ž๋ฆฌ์—์„œ ๋ฐ”๋กœ ํ’€ ์ˆ˜ ์žˆ์„๊นŒ..?