ComputerScience/Algorithm

[BOJ] 과제 안내신 분..? - 5597

pongpongie 2025. 1. 20. 19:42
728x90

[Bronze III] 과제 안 내신 분..? - 5597

문제 링크

성능 요약

메모리: 9344 KB, 시간: 92 ms

분류

구현

제출 일자

2025년 1월 20일 19:18:33

문제 설명

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

출력

출력은 2줄이다. 1번째 줄엔 제출하지 않은 학생의 출석번호 중 가장 작은 것을 출력하고, 2번째 줄에선 그 다음 출석번호를 출력한다.


후기

Array의 메서드 중 하나인 sort() 사용에 주의해야한다.

처음 다음과 같이 sort()를 작성하였다.

const fs = require("fs");
const filePath = process.platform === "linux" ? 0 : "run/input.txt";
const input = fs
  .readFileSync(filePath, "utf-8")
  .toString()
  .split("\n")
  .map(Number);

let students = new Array(30);

for (let i = 1; i <= students.length; i++) {
  students[i - 1] = i;
}

const assginment = (num) => {
  let answer = [];
  for (let i = 0; i < students.length; i++) {
    let pivot = students[i];
    for (let j = 0; j < input.length + 1; j++) {
      if (j === input.length) {
        answer.push(pivot);
        break;
      }
      if (input[j] === pivot) {
        break;
      }
    }
  }
  answer.sort();
  for (elem of answer) {
    console.log(elem);
  }
};

assginment(input.length);

내가 여태 찾았던 반례들에 대해서 문제없이 출력이 잘 되었는데, 계속 틀렸다.
결국 찾아보니 나와 비슷한 시행착오를 겪은 분이 계셨고, sort()를 사용하는 방법이 틀렸음을 알았다.

위의 answer.sort()answer.sort((a, b) => a - b);로 바꿈으로써 정답은 맞췄는데, 왜 정답이 되었는지 살펴보자.

sort()는 파라미터로 콜백 함수를 받는데, 없을 경우 기본적으로 요소를 문자열로 변환한 후 UTF-16 코드 단위 값의 순서에 따라 오름차순으로 정렬한다.

const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
console.log(fruits); // ["Apple", "Banana", "Mango", "Orange"]

따라서 숫자를 정렬할 때는 주의해야 한다. 적절한 콜백을 넣어주지 않으면 숫자를 문자열 취급하기 때문에 원하지 않는 결과가 나올 수 있다.

예를 들어 다음의 결과를 보자.

let arr = [100, 80, 90];
arr.sort();
console.log(arr); // [100, 80, 90]

따라서 원하는대로 숫자를 오름차순으로 정렬하기 위해서는 arr.sort((a, b) => a-b) 내림차순은 arr.sort((a, b) => b-a)와 같이 각각 양수와 음수를 반환하는 콜백을 넣어주면 된다.

좀 더 깊이 보자면, JavaScript의 sort()는 추가적인 메모리 공간을 사용하지 않고 배열을 정렬하는 제자리(in-place)알고리즘을 사용한다.

또한 sort()는 원본 배열을 변경하고, 같은 값을 가진 요소들의 상대적인 순서가 보장되지 않는 "불안정한" 정렬을 사용한다.

Reference

https://velog.io/@dontki11it/%EB%B0%B1%EC%A4%80Node.js-5597-%EA%B3%BC%EC%A0%9C-%EC%95%88-%EB%82%B4%EC%8B%A0-%EB%B6%84
https://www.perplexity.ai/search/jsyi-sort-hamsue-daehae-jasehi-x7xsM6RDShm34KIvqK20Uw