기타/알고리즘

(JS) 백준 13458번 : 시험 감독 (백준의 입력값 처리)

가나닩 2025. 1. 13. 01:13

문제를 풀기위해 아래와 같은 요소들을 고려하였다.

  1. 프로그래머스와 달리 백준은 입력값을 직접 처리해주어야 한다. (readline or fs)
  2. 총감독관 혼자 감독할 수 있는 경우와 부감독관이 필요한 경우로 나누어서 계산했다.
더보기
더보기
const readline = require("readline");

function solution(data) {
    const [n, ai, count] = data.split("\n");
    const st = ai.split(" ").map(Number);
    const [b, c] = count.split(" ").map(Number);
    let total = 0;

    for (let i = 0; i < Number(n); i++) {
        if (st[i] <= b) {
            total++;
            continue;
        }
        const nowSt = st[i] - b;
        const subTotal = Math.ceil(nowSt / c);
        total += subTotal + 1;
    }

    return total;
}

const input = [];
readline
    .createInterface({
        input: process.stdin,
        output: process.stdout,
    })
    .on("line", (line) => {
        input.push(line);
    })
    .on("close", () => {
        const data = input.join("\n");
        console.log(solution(data));
    });

 

 

• 백준의 입력값 처리

프로그래머스와 다르게 백준은 입력값을 직접 처리해주어야 한다.

 

const readline = require("readline");

function solution(data) {
	// solution 함수 내용 생략
}

const input = [];
readline
    .createInterface({
        input: process.stdin,
        output: process.stdout,
    })
    .on("line", (line) => {
        input.push(line);
    })
    .on("close", () => {
        const data = input.join("\n");
        console.log(solution(data));
    });
5
10 9 10 9 10
7 20

 

입력과정을 간단히 살펴보면 아래와 같다.

  • 값의 입력은 표준입력으로 받는다. 이 코드를 node로 실행해보면 터미널이 입력값을 받기위한상태가 된다.
  • 입력은 한줄씩 순차적으로 한다. 위 예시의 입력값이 있다면 5 => Enter => 10 9 10 9 10 => Enter => 7 20 => Enter => Ctrl+D(EOF) 순서로 입력한다. 백준에서는 이 과정이 자동으로 진행된다.
  • 입력된 값은 문자열형태로 배열에 순차적 저장된다. 이 배열값들을 그대로 활용하려면 input 배열을 사용하면 되고 문자열로 변환하여 사용하려면 join을 활용해 문자열로 변환하여 사용하면 된다.
  • console.log는 표준출력과 동일한 결과이다. output부분은 생략해도 동작에는 문제가 없다.
  •  

예시에서는 readline을 활용했고 fs를 활용하는 방법도 있다. 백준에서 node.js를 사용했을때 입력값 처리 문제로 인해 발생하는 런타임에러에 관한 아래 공지게시글을 확인하는것이 좋다.

 

백준 - Node.js 사용 시 런타임 에러(EACCES)가 발생한다면?

 

 

 

조건문을 이용한 경우의수 나누기

반복문 내부는 매우 간단히 구현되어있다.

  1. 최종적으로 필요한 감독관수는 total에 저장된다. total 값의 초기값은 0이다.
  2. 총감독관 혼자 감독이 가능한경우 : total에 1을 더한뒤 현재 반복을 건너뛰고 다음 반복을 시작한다. (continue)
  3. 총감독관 혼자 감독이 불가능한 경우 : 우선 학생수에서 총감독관이 감독가능한 학생수를 뺀다. 남은 학생수를 부감독관이 감독 가능한 학생수로 나눈뒤 올림(남은 학생 감독에도 부감독관이 필요하므로)처리하여 total에 총감독관 + 부감독관의 수를 더한다.

교실수만큼 위 과정을 반복하면 최종적으로 필요한 감독관의 수를 알아낼 수 있다.