본문 바로가기
Algorithm

99클럽 코테 스터디 12일차 TIL - 임스와 함께하는 미니게임 (백준 25757 / JavaScript)

by 륜곰 2025. 4. 16.

오늘의 문제 링크

 

⭐ intro : 문제를 생각해나간 방식

문제를 풀고 이해하는데 있어서 꽤나 오랜시간이 걸렸었다. 이 문제의 키포인트는 첫번째 문장의 '임스가 미니게임을 같이할 사람을 찾는다' 는 조건이었다. 이말인즉 임스는 '무조건' 게임에 한번씩 들어간다는 것이다. 즉 2, 3, 4명이서 플레이 하되 필요한 인원수는 임스 + n명이기에 필요한 인원수는 1, 2, 3명인 것이다. 그리고 같이 플레이하고자 하는 사람 중 동명이인은 존재하지 않는다라는 조건, 즉 중복조건을 제거하고 남은 인원수를 1, 2, 3명씩 나누면 임스랑 게임을 중복없이 진행하는 횟수를 만들게 된다.

 

⭐ 풀이과정

먼저 input값을 알맞게 잘 조리한다. 상단 조건중 인원수 N과 게임종료 G, 그리고 나머지 값들은 참여인원들이므로 전개연산자로 분리해두고, 런타임에러가 생기지 않도록 N명만큼만 사용하도록 배열을 잘라둔다.

let input = require("fs")
  .readFileSync("./example.txt")
  .toString()
  .split("\n")
  .map((line) => line.replace("\r", "").split(" "));

const [[N, G], ...arr] = input;
const rest = arr.slice(0, N);

function solution(G, rest) {}
solution(G, rest)

 

다음으로 중복값을 제거할 수 있도록 Set() 객체를 생성하여 전체 인원수를 Set()안에 추가해서 중복값을 제거한 값을 리턴받는다. 남은 인원수에서 임스랑 같이 게임하는 횟수를 구해야 하는데 게임 Y,F,O는 각각 임스를 제외하고 1,2,3명을 필요로 한다. 즉 전체 인원수에서 해당 인원수만큼으로 나누고, 가장 큰 정수값을 구하는 Math.floor값을 이용해서 해당 값을 구한다. 조건문은 switch를 이용해서 G값이 바뀔때마다 유동적으로 적용되도록 작업했다.

function solution(G, rest) {
  const set = new Set();
  for (let i of rest) {
    set.add(i[0]);
  }
  const size = set.size;
  
  switch (G) {
    case "Y":
      return Math.floor(size / 1);
    case "F":
      return Math.floor(size / 2);
    case "O":
      return Math.floor(size / 3);
  }
}

 

⭐ 제출답안

let input = require("fs")
  // .readFileSync(0, "utf-8")
  .readFileSync("./example.txt")
  .toString()
  .split("\n")
  .map((line) => line.replace("\r", "").split(" "));

const [[N, G], ...arr] = input;
const rest = arr.slice(0, N);

function solution(G, rest) {
  const set = new Set();
  for (let i of rest) {
    set.add(i[0]);
  }
  const size = set.size;
  switch (G) {
    case "Y":
      return Math.floor(size / 1);
    case "F":
      return Math.floor(size / 2);
    case "O":
      return Math.floor(size / 3);
  }
}
console.log(solution(G, rest));

하... 런타임에러 이녀석...잡기 짱힘들다

 

⭐ 공부했던 개념들

 

Math.floor() - JavaScript | MDN

Math.floor() 정적 메서드는 언제나 버림 처리하고 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.

developer.mozilla.org

  • 종종 풀다가 런타임에러를 겪게 된다. 분명 테스트 케이스 상으로는 전부 통과되는데, 이 런타임에러가 발생하게 될때마다 허탈함이 밀려오는데, 이때 겪는 에러는 대부분 내가 전개연산자로 나머지 부분을 할당해서 받아올때 발생하게 되었었다. 그래서 나머지 배열값들을 받아올 때 slice로 조건문에 제시된 N개의 숫자만큼 잘라줘서 해당 부분만 딱! 사용한다고 명시를 해줘야 런타임에러가 걸리지 않게 된다. 괜히 조건문 앞에 N개의 숫자만큼 제시되는것이 아니다. 다 런타임 에러 제거하라고 명시해주는듯 하다.