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);