백준 - 과제(13904번)

nyun-nye·2025년 4월 3일

백준 스터디

목록 보기
15/15

✏️ 백준 - 과제(13904번)


점수를 기준으로 내림차순 정렬을 하는 것이 포인트!




💭 코드 설계


문제 해결의 단계는 아래와 같다.
  1. N으로 과제의 개수를 저장하고, works 배열에 2차원 배열로 각 과제별 마감일과 점수를 저장한다.
  2. works 배열을 점수를 기준으로 내림차순 정렬하여 sortedWorks 배열로 저장한다.
  3. plan 배열을 과제의 개수만큼 크기를 지정하고, 0으로 초기화한다.
  4. sortedWorks 배열에서 순서대로 가져오면서 index에 "마감일 - 1"을 저장한다. plan[index]의 값이 0이면 해당 index에 과제의 점수를 넣는다. 0이 아니라면, index가 0이 되거나, plan[index]의 값이 0일때까지 index 값을 줄여나간다. plan[index]의 값이 0이라면 과제의 점수를 넣고 break한다.
  5. plan에 저장된 값들을 모두 더한다.



🅰️ 제출한 답


const input = require("fs")
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "./input.txt")
  .toString()
  .trim()
  .split("\n")
  .map((el) => el.split(" "));

  const N = Number(input[0][0]);
  let works = input.slice(1, N + 1).map((row) => row.map(Number));
  const sortedWorks = works.sort((a, b) => b[1] - a[1]);

  let plan = Array(N).fill(0);

  sortedWorks.forEach((work) => {
    let index = work[0]-1;
    if(plan[index] === 0){
      plan[index] = work[1];
    }else{
      while(index >= 0){
        if(plan[index] === 0){
          plan[index] = work[1];
          break;
        }else{
          index--;
        }
      }
    }
  })

  console.log(plan.reduce((acc, cur) => acc+cur, 0));



💡 해설


이 문제는 위에서도 언급했듯이 과제의 점수를 내림차순 하여, 점수가 큰 과제를 마감일 전에 먼저 배정하는 것이 포인트이다.
고민을 조금 했던 부분 중 첫 번째는 2차원 배열로 받아오는 값들을 Number로 형변환 하는 것이었다. 2차원 배열을 형 변환하기 위해서는 `map` 함수를 2번 사용하여아한다. 처음에는 `map`에서 `row`를 인자로 받아오고, 그 `row`를 다시 `map`을 이용해서 Number로 형변환 해야한다.
두 번째는 과제의 마감일과 점수를 2차원 배열로 받아오기 때문에 정렬을 할때 2차원 배열 내부의 1차원 배열의 두 번째 인덱스를 기준으로 내림차순 정렬을 해야한다. 이 방식을 떠올리는데 막혀서 검색을 해봤다. 허무하게도 인덱스 값에 그냥 1을 넣어주기만 하면 되는 것이었다.


🤔 소감


이 문제도 골드 문제라는 이야기를 들었다. 오랜만에 문제를 풀어서 그런지 문제 푸는 것이 재밌고 오래걸리지는 않았다. 코드 구조를 구현하는 것을 금방 해냈으나, 위에서 언급한 고민했던 문법적인 부분들이 오히려 발목을 잡았다. js 문법 공부를 다시 열심히 해야겠다는 생각이 들었다.
profile
시야가 넓은 개발자가 되기를 희망합니다.

0개의 댓글