BOJ[1011] - Fly me to the Alpha Centauri by JavaScript
Fly me to the Alpha Centauri
문제
언어
- JavaScript
문제 풀이 step 1
- 하나씩 그려보다가 특이점을 발견하게 되어서 풀 수 있었습니다.
-
그리다보면 아래의 표를 얻을 수 있습니다. 저는 제곱수들을 이용해서 풀었습니다.
-
거리 횟수 방법 1 1 1 2 2 11 3 3 111 4 3 121 5 4 1211 6 4 1221 7 5 12211 8 5 12221 9 5 12321 … … … 16 7 1234321 … … … 25 9 123454321
문제 풀이 step 2
- 제곱수들의 방법을 보시면 근호값을 기준으로 좌우가 딱 맞아떨어지며 1씩 감소합니다.
- 4 = 121
- 9 = 12321
- 16 = 1234321
- 제곱수와 제곱수 사이에는 짝수개의 수가 존재합니다.
- 1 ~ 4 = 2개
- 4 ~ 9 = 4개
- 9 ~ 16 = 6개
- 제곱수와 제곱수 사이에 존재하는 짝수개의 수들을 반으로 쪼개면, 반은 작은 제곱수의 개수에 + 1을 한 값이고, 반은 큰 제곱수의 개수와 같습니다.
- 1 ~ 4 => 2와 3으로 나눌 수 있는데 2는 거리가 1인 경우의 횟수 + 1이고, 3은 거리가 4인 경우의 횟수와 같습니다.
- 4 ~ 9 => 5, 6과 7, 8로 나눌 수 있는데 5, 6은 거리가 4인 경우의 횟수 + 1이고, 7, 8은 거리가 9인 경우의 횟수와 같습니다.
- 그래서 제곱수인지 먼저 판별하고, 제곱수가 아니라면 어떤 제곱수와 어떤 제곱수 사이에 있는 수인지 판별하고, 위의 규칙을 적용해서 풀었습니다.
소스 코드
const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");
const checkSquared = (num) => num === Math.pow(parseInt(Math.sqrt(num)), 2);
const solution = (input) => {
let T = parseInt(input[0]);
let res = "";
let index = 1;
while (T-- > 0) {
const [x, y] = input[index++].split(" ").map(Number);
const length = y - x;
const squaredLen = Math.sqrt(length);
// 제곱수인 경우
if (checkSquared(length)) {
res += `${squaredLen * 2 - 1}\n`;
continue;
}
// 제곱수가 아닌 경우
const start = Math.pow(parseInt(squaredLen), 2);
const end = Math.pow(parseInt(squaredLen + 1), 2);
if (length - start < end - length) {
res += `${Math.sqrt(start) * 2}\n`;
} else {
res += `${Math.sqrt(end) * 2 - 1}\n`;
}
}
return res;
};
console.log(solution(input));