https://www.acmicpc.net/problem/1917
## 풀이 사항
풀이 일자: 2024.09.05
풀이 시간: 40분
채점 결과: 정답
예상 문제 유형: 구현, dfs
## 풀이 방법
1. 마지막으로 받은 1의 좌표를 저장해두고 그 좌표부터 dfs를 탐색해준다.
2. map[nr][nc]가 1이고 방문하지 않았다면 dice에 넣어주고 재귀, 빠져나올땐 반대로 돌려준다.
3. dice에서는 방향만을 파라미터로 받고 해당 방향에 따라 주사위를 굴려주고 맨 밑바닥을 1로 바꾼다.
4. dice 배열에 0이 하나라도 있으면 ans -> false : no를 출력해준다.
풀이 방법에 대한 감이 잡히지 않아 주사위를 굴리라는 힌트를 보고 풀었다. 오래 붙잡아도 아이디어가 생각이 안날꺼 같으면 힌트를 좀 보고 푸는것도 나쁘지 않다 생각한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static int N = 6, sr, sc;
public static int[] dice;
public static int[][] map, visited;
public static boolean ans;
public static int[] dr = { -1, 0, 1, 0 };
public static int[] dc = { 0, 1, 0, -1 };
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
for (int tc = 1; tc <= 3; tc++) {
map = new int[N][N];
visited = new int[N][N];
dice = new int[N];
ans = true;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if (map[i][j] == 1) {
sr = i;
sc = j;
}
}
}
visited[sr][sc] = 1;
dice[2] = map[sr][sc];
dfs(sr, sc);
for (int i = 0; i < 6; i++) {
if (dice[i] == 0) {
ans = false;
}
}
if (ans) {
System.out.println("yes");
} else {
System.out.println("no");
}
}
}
public static void dfs(int r, int c) {
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nr >= N || nc < 0 || nc >= N)
continue;
if (map[nr][nc] == 1 && visited[nr][nc] == 0) {
visited[nr][nc] = 1;
dice(i);
dfs(nr, nc);
dice((i + 2) %4);
}
}
}
public static void dice(int d) {
int temp;
switch (d) {
case 0:
temp = dice[0];
dice[0] = dice[1];
dice[1] = dice[2];
dice[2] = dice[3];
dice[3] = temp;
break;
case 1:
temp = dice[4];
dice[4] = dice[2];
dice[2] = dice[5];
dice[5] = dice[0];
dice[0] = temp;
break;
case 2:
temp = dice[3];
dice[3] = dice[2];
dice[2] = dice[1];
dice[1] = dice[0];
dice[0] = temp;
break;
case 3:
temp = dice[5];
dice[5] = dice[2];
dice[2] = dice[4];
dice[4] = dice[0];
dice[0] = temp;
break;
}
dice[2] = 1;
}
}'코딩테스트 > JAVA' 카테고리의 다른 글
| [SWEA JAVA] 5643. [Professional] 키 순서 (4) | 2024.09.06 |
|---|---|
| [SWEA JAVA] 2477. [모의 SW 역량테스트] 차량 정비소 (1) | 2024.09.05 |
| [SWEA JAVA] 5215. 햄버거 다이어트 (2) | 2024.09.04 |
| [백준 JAVA] 16236번: 아기 상어 (0) | 2024.09.04 |
| [SWEA JAVA] 2117. [모의 SW 역량테스트] 홈 방범 서비스 (0) | 2024.09.03 |