
1. 문제 풀이 아이디어
- 주어진 문제에서 가능한 6가지 시작 경우를 모두 탐색하는 브루트포스 방식으로 문제를 해결할 수 있다.
2. 나의 정답 코드
using (StreamReader sr = new StreamReader(Console.OpenStandardInput()))
using (StreamWriter sw = new StreamWriter(Console.OpenStandardOutput()))
{
int[] input = Array.ConvertAll(sr.ReadLine().Trim().Split(), int.Parse);
int n = input[0];
int[] verso = { 5, 3, 4, 1, 2, 0 };
int[,] dice = new int[n, 6];
for (int i = 0; i < n; i++)
{
input = Array.ConvertAll(sr.ReadLine().Trim().Split(), int.Parse);
for (int j = 0; j < 6; j++)
{
dice[i, j] = input[j];
}
}
int result = 0;
for (int i = 0; i < 6; i++)
{
int d = dice[0, i];
int u = dice[0, verso[i]];
int max = Math.Max(d, u);
int sum = 0;
if (max < 6) sum += 6;
else if (d < 5 || u < 5) sum += 5;
else sum += 4;
for (int j = 1; j < n; j++)
{
for (int k = 0; k < 6; k++)
{
if (dice[j, k] != u) continue;
d = u;
u = dice[j, verso[k]];
max = Math.Max(d, u);
if (max < 6) sum += 6;
else if (d < 5 || u < 5) sum += 5;
else sum += 4;
break;
}
}
result = Math.Max(result, sum);
}
sw.WriteLine(result);
}
3. 정리
verso
배열을 통해 주사위의 각 면에 대한 반대편 인덱스를 정의한다.
- 0번째 주사위의 밑면을 0~5까지 모든 경우로 설정하고 반복을 시작한다.
- 밑면과 윗면이 정해지면, 해당 주사위에서 두 면을 제외한 나머지 4개의 옆면 중 최댓값을 구해
sum
에 더한다.
- 다음 주사위부터는 이전 주사위의 윗면 값과 일치하는 면을 현재 주사위의 밑면으로 찾는다.
- 해당 면의 반대편을 윗면으로 설정하고, 두 면을 제외한 나머지 옆면 중 최댓값을
sum
에 더한다.
- 주사위를 끝까지 쌓으면 합을 계산하고, 최댓값을
result
에 갱신한다.
- 6가지 시작 경우 중 최댓값을 출력해 문제를 해결한다.
Share article