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์ผ ๊ฑธ๋ ธ๋ค ๋ ๋์ฒด ์ธ์ ๋๋๊ฑธ๊น? ์ ๋ฐ ๋๊ณ ์๋ ์ค์ด๊ธธ ^_ใ
์ฝํ ์ ๋์ค๋ฉด ๊ทธ ์๋ฆฌ์์ ๋ฐ๋ก ํ ์ ์์๊น..?
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 21921 ๋ธ๋ก๊ทธ - Java (0) | 2023.05.12 |
---|---|
[BOJ] 20055 ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด - Java (1) | 2022.12.16 |
[BOJ] 18430 ๋ฌด๊ธฐ๊ณตํ - Java (0) | 2022.11.08 |
[BOJ] 1094 ๋ง๋๊ธฐ - Java (0) | 2022.10.29 |
[BOJ] 17471 ๊ฒ๋ฆฌ๋งจ๋๋ง - Java (1) | 2022.10.28 |