Home 백준 - 06
Post
X

백준 - 06

10872번 - 팩토리얼

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.


풀이

1
2
3
4
5
6
7
8
9
10
11
const filePath = process.platform !== "linux" ? "./test.txt" : "dev/stdin";

let input = require("fs").readFileSync(filePath).toString().trim();

console.log(factorial(input));

function factorial(num) {
  if (num == 0) return 1;

  return num * factorial(num - 1);
}

1676번 - 팩토리얼 0의 개수

N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.


풀이

소인수분해 했을 때 10의 갯수가 0의 갯수와 같습니다.

팩토리얼을 구하고 0을 계산하기보다는 10의 갯수를 구하는 방법을 사용해봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const filePath = process.platform !== "linux" ? "./test.txt" : "dev/stdin";

let input = require("fs").readFileSync(filePath).toString().trim();

let [two, five] = [0, 0];
let n = Number(input);

for (let i = 1; i <= n; i++) {
  let num = i;

  while (num % 2 == 0) {
    two++;
    num /= 2;
  }

  while (num % 5 == 0) {
    five++;
    num /= 5;
  }
}

console.log(two > five ? five : two);

2004번 - 조합 0의 개수

$n \choose m$의 끝자리 $0$의 개수를 출력하는 프로그램을 작성하시오.


풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const filePath = process.platform !== "linux" ? "./test.txt" : "dev/stdin";

let input = require("fs").readFileSync(filePath).toString().trim();

let [m, n] = input.split(" ").map(Number);

let [twoM, fiveM] = getTwoFive(m);
let [twoN, fiveN] = getTwoFive(n);
let [twoMN, fiveMN] = getTwoFive(m - n);

let two = twoM - twoMN - twoN;
let five = fiveM - fiveMN - fiveN;

console.log(two > five ? five : two);

// 1부터 num까지 모두 확인하지않고 num까지의 2의 배수와 5의 배수만 갯수를 확인합니다.
function getTwoFive(num) {
  let [two, five] = [0, 0];

  for (let i = 2; i <= num; i *= 2) {
    two += Math.floor(num / i);
  }

  for (let i = 5; i <= num; i *= 5) {
    five += Math.floor(num / i);
  }

  return [two, five];
}

17087번 - 숨바꼭질 6

수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, …, AN에 있다.

수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이동할 수 있다. 수빈이의 위치가 동생이 있는 위치와 같으면, 동생을 찾았다고 한다.

모든 동생을 찾기위해 D의 값을 정하려고 한다. 가능한 D의 최댓값을 구해보자.


풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const filePath = process.platform !== "linux" ? "./test.txt" : "dev/stdin";

let input = require("fs").readFileSync(filePath).toString().trim().split("\n");

let [_, start] = input[0].split(" ");
// 거리 배열 구하기
let distance = input[1].split(" ").map((x) => Math.abs(start - x));

cur =
  distance.length > 1 ? gcd(distance.pop(), distance.pop()) : distance.pop();

// 여러 값들의 최소 공배수를 구하기 위해 모든 값을 순차적으로 비교합니다.
for (let x of distance) {
  cur = gcd(cur, x);
}

console.log(cur);

function gcd(a, b) {
  if (a < b) [a, b] = [b, a];

  return a % b == 0 ? b : gcd(b, a % b);
}

1373번 - 2진수 8진수

2진수가 주어졌을 떄, 8진수로 변환하는 프로그램을 작성하시오.


풀이

parseInt + toString 조합으로 바로 출력 시도

1
2
3
4
5
const filePath = process.platform !== "linux" ? "./test.txt" : "dev/stdin";

let input = require("fs").readFileSync(filePath).toString().trim();

console.log(parseInt(input, 2).toString(8));
  • 문제점

    입력된 2진수 문자열이 길어지면 출력값이 Infinity가 됩니다.


다른 풀이

2진수를 세자리씩 끊어서 10진수로 변환하면 8진수로 표현할 수 있습니다.

따라서, 출력 문자열을 세자리씩 추가한 후 출력합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const filePath = process.platform !== "linux" ? "./test.txt" : "dev/stdin";

let input = require("fs").readFileSync(filePath).toString().trim().split("");

let answer = "";

while (input.length > 0) {
  // 2진수 세자리씩 끊어줍니다.
  let twos = input.splice(-3).join("");

  // 입력 문자열의 뒤에서부터 끊어내기때문에 앞에서부터 추가합니다.
  answer = parseInt(twos, 2) + answer;

  // 만약 문제의 타겟이 16진수라면 parseInt(twos, 2).toString(16) 처럼 toString으로 타겟 진수로 변환해줍니다.
  // answer = parseInt(twos, 2).toString(16) + answer
}

console.log(answer);

1212번 - 8진수 2진수

8진수가 주어졌을 때, 2진수로 변환하는 프로그램을 작성하시오.


풀이

1373번 문제 풀이를 응용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const filePath = process.platform !== "linux" ? "./test.txt" : "dev/stdin";

let input = require("fs").readFileSync(filePath).toString().trim().split("");

let answer = "";

while (input.length > 1) {
  let eight = input.pop();

  // padStart 메서드를 활용해 세자리를 채워줍니다.
  // 세자리까지 앞에 '0' 채워 세자리수 2진수를 만든 후 앞에 추가합니다.
  answer = parseInt(eight, 8).toString(2).padStart(3, "0") + answer;
}

// 마지막 남은 값은 '0' 채우기 없이 추가합니다.
answer = parseInt(input.pop(), 8).toString(2) + answer;

console.log(answer);
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.