[js] 백준 입력받기

HYEJIN·2023년 2월 7일
0

프로그래머스의 경우는 solution함수에 필요한 정보들을 넘겨주는데,
백준의 경우는 그렇지않다.

js는 입력받는 것이 타 언어에 비해 까다로운데, 이것을 정리해보려고 한다.

백준 4344번 문제로 입력받기 예시

// 예시 입력 데이터 
2
5 50 50 70 80 100
7 100 95 90 80 70 60 50

1. rest연산자 이용, 개행을 기준으로 배열 생성

let [n, ...input] = fs.readFileSync("index.txt").toString().split("\n");

개행을 기준으로 배열에 담아주는데 첫번째 인자는 개수를 나타내기 때문에 따로 담아주기 위해 배열에 rest 문법을 사용하여 나머지는 input에 담아주었다.

<결과>
n = 2
input = [ '5 50 50 70 80 100', '7 100 95 90 80 70 60 50' ]

2. n번만큼 for문을 돌려 각각 처리를 한다.

공백을 기준으로 나누고 1번과 동일하게 0번째는 요소의 개수를 나타냄으로 num이라는 변수에 받고, 나머지를 data에 묶어준다. 
for (let i = 0; i < n; i++) {
  let [num, ...data] = input[i].split(" ").map((item) => +item);

  //필요한 작업처리 후 console.log()
}

map은 각 요소가 숫자로 바껴야하기 때문에 +를 사용하여 숫자로 변경했다.

<결과>
[ 50, 50, 70, 80, 100 ] [ 100, 95, 90, 80, 70, 60, 50 ]

문제 소스코드

const fs = require("fs");

var [n, ...input] = fs.readFileSync("/dev/stdin").toString().split("\n");
for (let i = 0; i < n; i++) {
  let [num, ...data] = input[i].split(" ").map((item) => +item);
  const avg = data.reduce((total, cur) => total + cur, 0) / num;

  let highCnt = 0;
  data.forEach((item) => {
    if (item > avg) highCnt++;
  });
  console.log(((highCnt / num) * 100).toFixed(3) + "%");
}

프로그래머스처럼 데이터 가공하여 변경

데이터 가공

// 예시 입력 데이터 
2
5 50 50 70 80 100
7 100 95 90 80 70 60 50

예시 데이터가 위와 같다고 했을 때,
solution 함수에 인자가 어떻게 주어지면 좋은지에 대해서 생각해봤다.
(n , [[ , , ],[ , , , ]] )
위와같이 첫번째 인자에는 총 데이터의 개수
두번째 인자의 경우는 배열의 길이가 n개인 배열로 이루어진 데이터로 설정했다.

// 인자로 받을 데이터 형식
( 2, [ [ 50, 50, 70, 80, 100 ], [ 100, 95, 90, 80, 70, 60, 50] ] )

문제 소스코드

// 데이터 가공
const fs = require("fs");

let n;  // 데이터 개수 
let testCase = [];  // 데이터를 배열로 받음
let input; 

[n, ...input] = fs.readFileSync("index.txt").toString().split("\n");
for (let i = 0; i < n; i++) {
 let [_, ...data] = input[i].split(" ").map((item) => +item);
 testCase.push(data);
}

//---------------------------------
function solution(num, testCase) {
 for (let data of testCase) {
   const avg = data.reduce((total, cur) => total + cur, 0) / data.length;

   let highCnt = 0;
   data.forEach((item) => {
     if (item > avg) highCnt++;
   });
   console.log(((highCnt / data.length) * 100).toFixed(3) + "%");
 }
}

solution(n, testCase);

백준에서는 입력을 모두 처리해줘야하는데, 이를 프로그래머스에서는 인자로 넘겨주기 때문에 데이터를 바로 사용할 수 있다.

백준에서는 자바스크립트를 통해서 문제를 거의 풀지 않았기 때문에 한번 정리해봤고,
입력하는 방식에 대해서 확실히 이해했다!

0개의 댓글