알고리즘/백준

[백준 2116] 골드5 - 주사위 쌓기

www.acmicpc.net/problem/2116

 

2116번: 주사위 쌓기

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는 �

www.acmicpc.net

1. 개념

시뮬레이션

 

2. 풀이법

주사위의 반대편 면을 배열로 만들어서 체크하는게 중요하다.

 

3. 코드

import java.util.Scanner;

public class back_2116주사위쌓기 {
	static int side_idx[] = {5,3,4,1,2,0};
	static int box[][];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		box = new int[n][6];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < 6; j++) {
				box[i][j] = sc.nextInt();
			}
		}
		int answer=0;
		int total=0;
		for (int i = 0; i < 6; i++) {//1층에서 윗면의 경우의 수
			int upval=box[0][i];
			total = check(upval, 0, i);
			for (int fl = 1; fl < n; fl++) {//층
				for (int pos = 0; pos < 6; pos++) {//한 층에서 탐색
					if(upval==box[fl][pos]) {
						total += check(box[fl][pos], fl, pos);
						upval = box[fl][side_idx[pos]];
						break;
					}
				}
			}
			answer = answer< total ? total: answer;
		}
		System.out.println(answer);
	}
	//최대값 찾기
	static int check(int up, int fl, int idx) {
		int temp=0;
		for (int pos = 0; pos < 6; pos++) {
			if(box[fl][pos]==box[fl][idx] || box[fl][pos]==box[fl][side_idx[idx]]) {
				continue;
			}
			temp = temp < box[fl][pos]? box[fl][pos] : temp;
		}
		return temp;
	}
}

 

반대편 면의 index를 배열로 만들었다

static int side_idx[] = {5,3,4,1,2,0};

 

아래층 윗면과 윗층 아랫면이 같은 부분을 찾는 코드, 찾고나서 upval에 윗층의 윗면으로 갱신해야 한다

for (int pos = 0; pos < 6; pos++) {//한 층에서 탐색
  if(upval==box[fl][pos]) {
    total += check(box[fl][pos], fl, pos);
    upval = box[fl][side_idx[pos]];
  break;
  }
}

 

주사위의 윗면과 아랫면은 제외하고 최대값을 찾아준다

if(box[fl][pos]==box[fl][idx] || box[fl][pos]==box[fl][side_idx[idx]]) {
	continue;
}
temp = temp < box[fl][pos]? box[fl][pos] : temp;