21608. 상어 초등학교 - node.js / javascript

윤상준·2022년 6월 30일
0

BOJ - node.js / javascript

목록 보기
50/55
post-thumbnail

문제

내 코드

let fs = require("fs");
let input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");

function solution(input) {
  let N = Number(input[0]);
  input = input.slice(1).map((v) => v.split(" ").map(Number));
  let board = Array.from({ length: N }, () => Array(N).fill(0));
  const dx = [1, 0, -1, 0];
  const dy = [0, 1, 0, -1];
  let favorites = {};
  let students = [];
  let answer = 0;

  for (let x of input) {
    students.push(x[0]);
    favorites[x[0]] = x.slice(1);
  }

  for (let student of students) {
    let candidates = {};
    for (let row = 0; row < N; row++) {
      for (let col = 0; col < N; col++) {
        if (board[row][col] !== 0) continue;
        let count = [0, 0]; // 우선 순위 수, 비어있는 칸 수,
        for (let i = 0; i < dx.length; i++) {
          const [nRow, nCol] = [row + dx[i], col + dy[i]];
          if (nRow < 0 || nRow >= N || nCol < 0 || nCol >= N) continue;
          if (favorites[student].includes(board[nRow][nCol])) count[0]++;
          if (!board[nRow][nCol]) count[1]++;
        }
        const key = JSON.stringify(count);
        if (!candidates[key]) candidates[key] = [[row, col]];
        else candidates[key].push([row, col]);
      }
    }
    const sorted = Object.keys(candidates).sort((a, b) => {
      const [a0, a1] = JSON.parse(a);
      const [b0, b1] = JSON.parse(b);
      if (a0 !== b0) return b0 - a0;
      return b1 - a1;
    });
    const [newRow, newCol] = candidates[sorted[0]][0];
    board[newRow][newCol] = student;
  }

  for (let student of students) {
    let favCount = 0;
    for (let row = 0; row < N; row++) {
      for (let col = 0; col < N; col++) {
        if (board[row][col] === student) {
          for (let i = 0; i < dx.length; i++) {
            const [nRow, nCol] = [row + dx[i], col + dy[i]];
            if (nRow < 0 || nRow >= N || nCol < 0 || nCol >= N) continue;
            if (favorites[student].includes(board[nRow][nCol])) favCount++;
          }
        }
      }
    }
    switch (favCount) {
      case 0:
        answer += 0;
        break;
      case 1:
        answer += 1;
        break;
      case 2:
        answer += 10;
        break;
      case 3:
        answer += 100;
        break;
      case 4:
        answer += 1000;
        break;
    }
  }

  return answer;
}

console.log(solution(input));

깃허브 링크

https://github.com/highjoon/Algorithm/blob/master/BOJ/21608.js

후기

핵심 아이디어는 다음과 같다.
이 부분을 해결하지 못해 다른 풀이를 참고했다.

각 좌표마다 우선순위 칸의 수, 빈칸의 수를 구해 배열로 저장하고
이 배열을 key로 좌표를 value로 하여 객체에 모아놓는다.

객체에 배열을 key로 저장할 때는 JSON.stringify()를, 읽을 때는 JSON.parse를 사용하는 것이 유용하다.

원래는 템플릿 리터럴을 썼었는데 훨씬 더 간편하다.
앞으로도 유용하게 쓸 수 있는 방식인 것 같다.

profile
하고싶은건 많은데 시간이 없다!

0개의 댓글