[알고리즘 문제 풀기] 주사위 쌓기(2116)

C#
lhs's avatar
May 24, 2025
[알고리즘 문제 풀기] 주사위 쌓기(2116)
notion image

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

LHS's Study Space