[백준] 2116 주사위 쌓기 - javascript

Yongwoo Cho·2022년 4월 26일
0

알고리즘

목록 보기
82/104
post-thumbnail
post-custom-banner

📌 문제

https://www.acmicpc.net/problem/2116

📌 풀이

function solution(dice) {
  let answer = 0;

  let pair = new Array(7);
  pair[1] = 6;
  pair[2] = 4;
  pair[3] = 5;
  pair[4] = 2;
  pair[5] = 3;
  pair[6] = 1;

  for (let i = 1; i <= 6; i++) {
    let sum = 0;
    let sideMax = 0;
    for (let j = 1; j <= 6; j++) {
      if (j != dice[0][i - 1] && j != dice[0][pair[i] - 1]) {
        sideMax = Math.max(sideMax, j);
      }
    }
    sum += sideMax;

    let x = dice[0][i - 1]; 
    let idx = 0;

    for (let k = 2; k <= dice.length; k++) {
      sideMax = 0;
      for (let l = 1; l <= 6; l++) {
        if (dice[k - 1][l - 1] === x) {
          idx = l;
          break;
        }
      }

      let top = dice[k - 1][pair[idx] - 1];
      let bottom = x;

      for (let m = 1; m <= 6; m++) {
        if (m != top && m != bottom) sideMax = Math.max(sideMax, m);
      }
      sum += sideMax;
      x = top;
    }
    answer = Math.max(answer, sum);
  }

  return answer;
}

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');

let dice = [];
input.slice(1).map((i) => dice.push(i.split(' ').map(Number)));
console.log(solution(dice));

✔ 알고리즘 : 구현

✔ pair 배열을 통해 마주보는 면을 미리 정의

✔ 맨 아래 주사위에서 윗면을 고르는 경우의 수 6가지로 부터 출발 (i for문)

✔ 위아래 면을 제외한 제일 큰 수 고르기 (j for문) 👉 제일 큰 수 sum에 더해줌

✔ 윗면의 수가 정해졌으므로 2번 주사위부터 탐색시작 (k for문)

✔ 해당 주사위의 위아래 면 찾기 (l for문)

✔ 해당 주사위의 옆면 중 최댓값 찾기 (m for문) 👉 제일 큰 수 sum에 더해줌

✔ 난이도 : 백준 기준 골드 4

profile
Frontend 개발자입니다 😎
post-custom-banner

0개의 댓글