본문 바로가기
Algorithm/BOJ

1차원 배열 편(2) - Node.js로 [백준/BOJ] 단계별로 풀어보기를 풀어보다

by Muko 2020. 5. 11.
728x90

저번 포스팅과의 시간 공백이 정말 많이 길었습니다.
이어서 1차원 배열 편 포스팅 하겠습니다!

BOJ 3052 - 나머지

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지입니다. 이 때, 수 10개를 입력받은 뒤 42로 나눈 나머지 중에서 서로 다른 값이 몇 개 있는지 출력하는 문제입니다. 실제로 다른 프로그래밍 언어에서나 Javascript에서도 % 연산자는 나머지를 구할 때 사용합니다. 이 문제를 해결하기 위해서는 나머지를 구하는 부분, 그리고 지금까지 나머지가 몇 개 나왔는지 저장하고 그 갯수를 구하는 부분을 구현해야 합니다.

// 입출력에 사용할 rl을 받아오는 함수
const getRl = () => {
  const readline = require('readline');
  return readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
}
const rl = getRl();

// 주어진 입력들을 이용해서 정답을 반환하는 함수
const printAnswer = (inputs) => {
  const saved = Array(42).fill(false);
  let answer = 0;

  for(let i=0; i<inputs.length; i++){
    if(!saved[inputs[i]]){
      saved[inputs[i]] = true;
      answer++;
    }
  }
  console.log(answer);
};

// 입력 받아와서 알고리즘 동작하는 함수
const inputs = [];
const MOD = 42;
const start = (rl) => {
  rl.on('line', line => {
    inputs.push(parseInt(line) % MOD);
  }).on('close', () => {
    printAnswer(inputs);
    process.exit();
  });
}

// 프로그램 동작
start(rl);

이렇게 구현할 수도 있고, Set 자료구조를 이용해서도 해결할 수 있습니다.

const printAnswer = (inputs) => {
  const saved = new Set();
  inputs.forEach(input => {
    saved.add(input);
  });
  console.log(saved.size);
};


BOJ 1546 - 평균

세준이의 점수 중에 최댓값을 M이라고 하고, 나머지 모든 점수를 점수 / M * 100으로 수정했다고 합니다. 이 방법대로 성적을 다시 계산했을 때 새로운 평균을 구하는 문제입니다. 이 때 과목 수는 N개이며, 입력은 총 2줄입니다. 이 문제를 해결하려면 각 점수에서 최댓값을 찾아야하고, 그 최댓값 M을 이용해서 새로운 점수를 만들고, 그 점수의 평균을 구하면 해결할 수 있는 문제입니다.

// 입출력에 사용할 rl을 받아오는 함수
const getRl = () => {
  const readline = require('readline');
  return readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
}
const rl = getRl();

const getAvg = (numbers) => {
  const sum = numbers.reduce((prev, next) => prev + next, 0);
  return sum / numbers.length;
};

// 주어진 입력들을 이용해서 정답을 반환하는 함수
const printAnswer = (input) => {
  const numbers = [...input[1].split(' ')].map(number => parseInt(number));
  const M = Math.max(...numbers);
  const newNumbers = numbers.map(number => number/M*100);
  console.log(getAvg(newNumbers));
};

// 입력 받아와서 알고리즘 동작하는 함수
const input = [];
const start = (rl) => {
  rl.on('line', line => {
    input.push(line);
  }).on('close', () => {
    printAnswer(input);
    process.exit();
  });
}

// 프로그램 동작
start(rl);

BOJ 8958 - OX퀴즈

OOXXOXXOOO와 같은 OX퀴즈 결과가 있을 때, 점수 계산은 연속된 O의 개수입니다. 이 때, 퀴즈 결과에 대한 점수를 계산하는 것을 구현하는 문제입니다. 연속된 O의 개수를 어떻게 구할지에 대한 고민만 해결된다면 쉽게 해결할 수 있는 문제입니다.

// 입출력에 사용할 rl을 받아오는 함수
const getRl = () => {
  const readline = require('readline');
  return readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
}
const rl = getRl();

const getSigma = N => {
  return N*(N+1)/2;
};

// 주어진 입력들을 이용해서 정답을 반환하는 함수
const printAnswer = (input) => {
  let answer = '';
  for(let i=1; i<input.length; i++) {
    const scored = input[i].split('X');
    const value = scored.reduce((prev, next) => {
      return prev + getSigma(next.length);
    }, 0);
    answer += value + '\n';
  }
  console.log(answer);
};

// 입력 받아와서 알고리즘 동작하는 함수
const input = [];
const start = (rl) => {
  rl.on('line', line => {
    input.push(line);
  }).on('close', () => {
    printAnswer(input);
    process.exit();
  });
}

// 프로그램 동작
start(rl);

고생하셨습니다!

728x90

댓글