백준
[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);