![[BOJ] ๋ฐฑ์ค 16985 Maaaaaaaaaze (JAVA)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9PVVr%2FbtsJfzFrPWd%2FDCCeaDPR6f1moEysFZzwck%2Fimg.png)

๐ ๋ฌธ์

๐ฑ ์์ด๋์ด
์์ด๊ณผ ์ค๋ณต์์ด์ 3์ฐจ์ ๋ฐฐ์ด์ ์ปจํธ๋กคํด ๋ณด์!
๋ฌธ์ ๋ฅผ ์ ํ๊ณ ๋์, 3์ฐจ์ ๋ฐฐ์ด์ ๋ฏธ๋ก ์ฐพ๊ธฐ๋ ์ด๋ฏธ ๋ช ๋ฒ ํด๋ณด์๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ง ์์๋ค.
๊ฐ์ฅ ๊ณ ๋ฏผํ๋ ์ ์ ์ด๋ป๊ฒ ์ต์ ์ 3์ฐจ์ ๋ฏธ๋ก๋ฅผ ๋ง๋๋์๋ค...
๊ทธ๋์ ์์ด๊ณผ ์ค๋ณต์์ด๋ก ๋ฐฐ์ด์ ์ปจํธ๋กคํ ์ ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ง๋๋ ค๊ณ ํ๋ค
์ค๋ณต์์ด์ ๋ฐฐ์ด ํ ์ธต์ 90๋, 180๋, 270๋๋ฅผ ํธ๋ค๋งํ ๋ ์ฌ์ฉํ๊ณ
๋น์ฐํ๊ฒ๋ ์ธ๋ฑ์ค๊ฐ ๊ฒน์น๋ฉด ์ ๋๊ธฐ ๋๋ฌธ์ ์์ด์ 3์ฐจ์ ๋ฐฐ์ด์ ์ธต์ ์กฐ๋ฆฝํ ๋ ์ฌ์ฉํ๋ค
์์ด, ์ค๋ณต์์ด์ ๊ตฌํ๊ณ ๋ฐฐ์ด์ ํธ๋ค๋งํด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋์ง ์๋๋ค๊ณ ํ์ ํ๊ณ ๊ตฌํํ๋ค.
๋จผ์ ์ค๋ณต ์์ด, ์์ด ๊ตฌํ๊ณ
2์ค for๋ฌธ์ผ๋ก ๊ฐ๊ฐ์ ๊ฐ๋์์ ๋ฐฐ์ด์ ์ธต์ ์๋ ๋ฐฉ์์ผ๋ก ๋ชจ๋ 3์ฐจ์ ๋ฐฐ์ด์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฒดํฌํ๋ค.
๋ง๋ ํ๋ธ๋ง๋ค BFS๋ก ๋ฏธ๋ก ์ฐพ๊ธฐ๋ฅผ ์งํํ๊ณ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๋ค!!
๐ฑ ์ฝ๋ ๋ฐ ํ์ด
import java.io.*; | |
import java.util.*; | |
public class Main { | |
public static int cnt = 1; | |
public static int[][][] arr1; | |
public static boolean[][][] vi; | |
private static boolean[] visit; | |
public static List<Integer> nPr = new ArrayList<>(); | |
public static List<Integer> nR = new ArrayList<>(); | |
public static class node { | |
int z, x, y, cnt; | |
public node(int z, int x, int y, int cnt) { | |
this.z = z; | |
this.x = x; | |
this.y = y; | |
this.cnt = cnt; | |
} | |
} | |
// ์์ด ๊ตฌํ๊ธฐ | |
public static void dfs1(int input, int cnt) { | |
if (cnt== 5) { | |
nPr.add(input); | |
return; | |
} | |
for (int i = 1; i <= 4; i++) { | |
dfs1(input*10+i, cnt+1); | |
} | |
} | |
// ์ค๋ณต ์์ด ๊ตฌํ๊ธฐ | |
public static void dfs2(int input, int cnt) { | |
if (cnt == 5) { | |
nR.add(input); | |
return; | |
} | |
for (int i = 1; i <= 5; i++) { | |
if (!visit[i]) { | |
visit[i] = true; | |
dfs2(input * 10 + i, cnt + 1); | |
visit[i] = false; | |
} | |
} | |
} | |
// ๋ฐฐ์ด ์ธต ์กฐํฉํ๊ธฐ | |
public static int[][][] controlStack(String dir, int[][][] copy) { | |
int[][][] tmp = new int[5][5][5]; | |
for (int i = 0; i < 5; i++) { | |
int toIdx = Character.getNumericValue(dir.charAt(i)); | |
for (int j = 0; j < 5; j++) { | |
for (int k = 0; k < 5; k++) { | |
tmp[toIdx-1][j][k] = copy[i][j][k]; | |
} | |
} | |
} | |
return tmp; | |
} | |
// ๋ฐฐ์ด ์ธต์ ๊ฐ๋ ์กฐ์ ํ๊ธฐ | |
public static int[][][] controlCube(String dir) { | |
int[][][] tmp = new int[5][5][5]; | |
// 0์ ์ ์๋ฆฌ, 1์ 90, 2์ 180, 3์ 270 | |
for (int i = 0; i < 5; i++) { | |
char control = dir.charAt(i); | |
if (control == '1') { // ์์์น | |
for (int j = 0; j < 5; j++) { | |
for (int k = 0; k < 5; k++) { | |
tmp[i][j][k] = arr1[i][j][k]; | |
} | |
} | |
} | |
if (control == '2') { // 90๋ ํ์ | |
for (int j = 0; j < 5; j++) { | |
for (int k = 0; k < 5; k++) { | |
tmp[i][k][4 - j] = arr1[i][j][k]; | |
} | |
} | |
} | |
if (control == '3') { // 180๋ ํ์ | |
for (int j = 0; j < 5; j++) { | |
for (int k = 0; k < 5; k++) { | |
tmp[i][4 - j][4 - k] = arr1[i][j][k]; | |
} | |
} | |
} | |
if (control == '4') { // 270๋ ํ์ | |
for (int j = 0; j < 5; j++) { | |
for (int k = 0; k < 5; k++) { | |
tmp[i][4 - k][j] = arr1[i][j][k]; | |
} | |
} | |
} | |
} | |
return tmp; | |
} | |
// 3์ฐจ์ ๋ฐฐ์ด ๋ฏธ๋ก์ฐพ๊ธฐ BFS | |
public static int bfs(int[][][] now) { | |
Queue<node> qu = new LinkedList<>(); | |
int[] dx = {0, 0, -1, 1, 0, 0}; | |
int[] dy = {-1, 1, 0, 0, 0, 0}; | |
int[] dz = {0, 0, 0, 0, -1, 1}; | |
qu.offer(new node(0, 0, 0, 0)); | |
if (now[0][0][0] == 0 || now[4][4][4] == 0) { | |
return -1; | |
} | |
while (!qu.isEmpty()) { | |
node nd = qu.poll(); | |
if (nd.z == 4 && nd.y == 4 && nd.x == 4) { | |
return nd.cnt; | |
} | |
for (int i = 0; i < 6; i++) { | |
int nz = nd.z + dz[i]; | |
int nx = nd.x + dx[i]; | |
int ny = nd.y + dy[i]; | |
if (nz < 0 || nx < 0 || ny < 0 || nz >= 5 || nx >= 5 || ny >= 5) continue; | |
if (!vi[nz][ny][nx] && now[nz][ny][nx] == 1) { | |
vi[nz][ny][nx] = true; | |
qu.offer(new node(nz, nx, ny, nd.cnt + 1)); | |
} | |
} | |
} | |
return -1; | |
} | |
public static void main(String[] args) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
StringTokenizer st; | |
arr1 = new int[5][5][5]; | |
visit = new boolean[6]; | |
for (int i = 0; i < 5; i++) { | |
for (int j = 0; j < 5; j++) { | |
st = new StringTokenizer(br.readLine()); | |
for (int k = 0; k < 5; k++) { | |
arr1[i][j][k] = Integer.parseInt(st.nextToken()); | |
} | |
} | |
} | |
dfs1(0, 0); | |
dfs2(0, 0); | |
int answer = Integer.MAX_VALUE; | |
for (int dir1 : nPr) { | |
vi = new boolean[5][5][5]; | |
int[][][] cube = controlCube(String.valueOf(dir1)); | |
for (int dir2 : nR) { | |
vi = new boolean[5][5][5]; | |
int[][][] cubeStack = controlStack(String.valueOf(dir2), cube); | |
int res = bfs(cubeStack); | |
if (res == -1) continue; | |
answer = Math.min(answer, res); | |
} | |
} | |
System.out.println(answer == Integer.MAX_VALUE ? -1 : answer); | |
} | |
} |
๐ฑ ๋๋ ์
SSAFY์ ์ ๊ณผํ๊ณ Aํ ์ํ์ ์ค๋นํ๋ฉด์ ์์ด, ์กฐํฉ ๋ฌธ์ ๊ฐ ์ค์ํ๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ๋ฃ๊ณ ํ์ด๋ณธ ๋ฌธ์ ์ด๋ค.
์๊ฐ๋ณด๋ค ์ ํ๋ ค์ ๋๋๊ณ , ์์ด, ์ค๋ณต์์ด, ์กฐํฉ์ ์์ ๋กญ๊ฒ ๊ตฌํํ ์ ์์ด์ ํธํ๊ฒ ํ์๋ค.
๊ธฐ๋ฐํ ๋ฌธ์ ๋ผ์ ๋ค๋ฅธ ๋๊ธฐ๋ค์๊ฒ๋ ์ถ์ฒํด ์ค์ผ๊ฒ ๋ค!
'Algorithm > - Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ๋ฐฑ์ค 20157 ํ์ด์ ์์! (JAVA) (0) | 2024.07.07 |
---|---|
[BOJ] ๋ฐฑ์ค 17472 ๋ค๋ฆฌ ๋ง๋ค๊ธฐ 2 (JAVA) (0) | 2024.07.07 |
[BOJ] ๋ฐฑ์ค 11376 ์ดํ๊ฐํธ 2 (JAVA) (0) | 2024.06.28 |
[BOJ] ๋ฐฑ์ค 23559 ๋ฐฅ (JAVA) (0) | 2024.06.21 |
[BOJ] ๋ฐฑ์ค 19577 ์ํ์ ์ฌ๋ฐ์ด (JAVA) (0) | 2024.05.26 |
๋๋ง์ ๊ฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค!
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!