본문 바로가기

코딩테스트/JAVA

[백준 JAVA] 1917번: 정육면체 전개도

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;
	}
}