본문 바로가기

백준

[Node.js] 백준 - 기본 수학 문제 1 : 달팽이는 올라가고 싶다, ACM호텔, 부녀회장이 될테야

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



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


기본 수학 문제 1 (3개)

  • 최대한 반복문 없이 수학을 활용하도록 노력했습니다.

(4) 달팽이는 올라가고 싶다.


정상 까지 도착하면 무조건 올라가는 것으로 끝난다고 볼 수 있습니다.

무조건 u - d + u - d + ... + u로 끝납니다.

day(u-d) + d = h

day = (h-d)/(u-d)


// (4) 달팽이는 올라가고 싶다
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
input = input[0].split(" ");
const u = Number(input[0]);
const d = Number(input[1]);
const h = Number(input[2]);
console.log(Math.ceil((h - d) / (u - d)));

(5) ACM 호텔


몇번 째 줄의 몇 층인 지가 중요점 입니다.


// (5) ACM 호텔
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const testCount = Number(input[0]);
for (let i = 1; i <= testCount; i++) {
  const row = input[i].split(" ");
  const H = Number(row[0]);
  const N = Number(row[2]);

  const line = Math.ceil(N / H);
  const floor = N - H * (line - 1);
  console.log(floor * 100 + line);
}

(6) 부녀회장이 될테야


층은 0 ~ 14 까지, 호수는 1 ~ 14까지 이므로 층과 호수의 개수는 다릅니다.

문제의 테스트케이스 크기 만큼의 층과 호수의 2차원 배열을 만들었습니다.

수학적으로 하나의 식으로 유도하기는 힘들어서, 내부적인 규칙을 활용해서 해당 호수의 인원수를 채워 넣고, 필요한 호수의 값을 가져오는 방식을 사용하였습니다.

  • Array.from()을 활용하면, 손쉽게 의도적으로 초기화 된 배열을 만들 수 있습니다.
    • Array.from에 length 객체와 Callback을 넣으면 됩니다.
    • const rooms = Array.from({ length: 15 }, () => Array(14).fill(0));
    • 위의 경우 2차 배열로, 14개의 0을 갖는 아이템을 갖는 배열을 아이템으로 15개를 가지는 외부 배열의 구조를 갖습니다.

// (6) 부녀회장이 될테야
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const testCount = Number(input[0]);
const rooms = Array.from({ length: 15 }, () => Array(14).fill(0));
let answer = "";
for (let i = 0; i < 15; i++) {
  rooms[i][0] = 1;
  if (i < 14) {
    rooms[0][i] = i + 1;
  }
}
for (let i = 1; i < 14; i++) {
  for (let j = 1; j < 15; j++) {
    rooms[j][i] = rooms[j - 1][i] + rooms[j][i - 1];
  }
}

for (let i = 0; i < testCount; i++) {
  const floor = Number(input[2 * i + 1]);
  const line = Number(input[2 * i + 2]) - 1;
  answer += `${rooms[floor][line]}\n`;
}

console.log(answer);