본문 바로가기

백준

[Node.js] 백준 - 1차원 배열 문제 : 최소&최대, 최댓값, 숫자의 개수, 나머지, 평균, OX퀴즈, 평균은 넘겠지

📝 Node.js를 이용해 백준 문제 풀기



Node.js를 이용해서 백준 문제를 풀고 있습니다.


배움


  • console.log를 통해서 하나 하나 출력하면, 느리므로 시간제한이 있는 경우 출력 값들을 변수에 계속 추가하는 식으로 하여 최종 마지막에 console.log 한번만 불러서 모두 출력하도록 하자. (출력이 줄 단위로 표기해야 하는 경우 추가하는 값의 마지막에 개행 문자를 추가하는 식으로 하면 된다.)
  • input을 받아오는 경우, 가끔 개행 문자중에 \n 만이 아니라 \r\n인 경우도 있다. 입력값을 받아올 때는 trim하여 확인해 보자 어떤 개행 문자가 들어 있지는 않은지
    • 윈도우 : \r\n, 유닉스 \n, 맥 \r
  • 너무 최신의 ES 문법의 경우 백준에서 인식하지 않을 수도 있다.

1차원 배열 문제 (7개)


(1) 최소, 최대 문제


// (1) 최소, 최대 문제
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().split("\n");

const nums = input[1].split(" ");
let max = Number(nums[0]);
let min = Number(nums[0]);

for (let i = 0; i < nums.length; i++) {
  const cur = Number(nums[i]);
  if (max < cur) {
    max = cur;
  } else if (min > cur) {
    min = cur;
  }
}

console.log(min, max);

(2) 최댓값


// (2) 최댓값
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().split("\n");

let max = Number(input[0]);
let index = 0;
for (let i = 0; i < input.length; i++) {
  const cur = Number(input[i]);
  if (cur > max) {
    max = cur;
    index = i;
  }
}

console.log(max);
console.log(index + 1);

(3) 숫자의 개수


// (3) 숫자의 개수
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

let multiply = 1;
input.map((item) => {
  multiply = multiply * Number(item);
  // multiply *= Number(item) <- 의 경우 지원하지 않는 듯함
});

const counts = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

const strMulti = multiply.toString();

for (let i = 0; i < strMulti.length; i++) {
  const value = Number(strMulti[i]);
  counts[value] += 1;
}

console.log(counts.join("\n"));

(4) 나머지


// (4) 나머지
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

const remainder = new Set([]);

for (let i = 0; i < input.length; i++) {
  remainder.add(Number(input[i]) % 42);
}

console.log(remainder.size);

(5) 평균


// (5) 평균
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

const count = Number(input[0]);
const scores = input[1].split(" ");
let max = Number(scores[0]);

for (let i = 0; i < scores.length; i++) {
  const cur = Number(scores[i]);
  if (cur > max) {
    max = cur;
  }
}

const newScores = scores.map((item) => (Number(item) / max) * 100);
const average = newScores.reduce((prev, cur) => prev + cur, 0) / count;

console.log(average);

(6) OX퀴즈


// (6) OX퀴즈
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const count = Number(input[0]);
let answer = "";

for (let i = 1; i <= count; i++) {
  const row = input[i].split("");
  let circleValue = 0;
  let rowSum = 0;

  for (let i = 0; i < row.length; i++) {
    const cur = row[i];
    const prev = row[i - 1];

    if (prev !== cur && cur === "O") {
      circleValue = 1;
      rowSum += circleValue;
    } else if (prev === cur && cur === "O") {
      circleValue += 1;
      rowSum += circleValue;
    }
  }

  answer += `${rowSum}\n`;
}

console.log(answer);

(7) 평균은 넘겠지


// (7) 평균은 넘겠지
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
let answer = "";

for (let i = 0; i < input.length; i++) {
  const row = input[i].trim().split(" ");
  const students = Number(row[0]);
  // 입력 유효성 검사
  if (!students || students > row.length) {
    continue;
  }
  // 평균 구하기
  let sum = 0;
  let pass = 0;
  for (let i = 1; i < row.length; i++) {
    sum += Number(row[i]);
  }
  const average = sum / students;

  // 평균을 넘는 사람의 수 구하기
  for (let i = 1; i < row.length; i++) {
    if (Number(row[i]) > average) {
      pass += 1;
    }
  }
  // 평균을 넘는 사람 비율 구하기(소수 3째 자리 까지 모두 표기)
  answer += `${parseFloat(
    Math.round((pass / students) * 100 * 1000) / 1000
  ).toFixed(3)}%\n`;
}
console.log(answer);