Problem Solving/boj.kr (JS)
[BOJ / 자바스크립트] 1193 : 분수찾기
hoiiiii
2022. 7. 11. 17:47
문제 : https://www.acmicpc.net/problem/1193
1193번: 분수찾기
첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.
www.acmicpc.net
Sol )
- 입력받은 n이 몇 번째 대각선에 포함되는지 찾은 후 대각선의 가로 혹은 세로 시작점 (a/1 또는 1/a 형태)의 순서와 n 번째 순서까지의 차이를 계산해서 정답 출력
- 대각선 : 첫번째 선 ( 1/1 ), 두번째 선 (1/2, 2/1), 세번째 선 (3/1, 2/2, 1/3)
- 첫 번째 선에서 두 번째 선으로 이동할 때 가로 순서 증가량은 1, 세로 증가량은 2 이다.
- 두 번째 선에서 세 번째 선으로 이동할 때 가로 순서 증가량은 4, 세로 증가량은 1 이다.
- 홀수번째 선(= x)에서 짝수번째 선으로 이동할 때 가로는 항상 1 증가, 세로는 2 + 4 * (x/2)의 몫 씩 증가
- 짝수번째 선(= x)에서 홀수번째 선으로 이동할 때 세로는 항상 1 증가, 가로는 4 * (x/2)의 몫 씩 증가
소스코드 )
const n = Number(require("fs").readFileSync("/dev/stdin"));
const getPos = (r, c, n, line) => {
const standard = line % 2 ? r : c;
const one = line - (n - standard);
const two = 1 + (n - standard);
return line % 2 ? `${one}/${two}` : `${two}/${one}`;
};
const solution = (n) => {
const diff = 4;
let [r, c] = [1, 1];
let [rDiff, cDiff] = [2, 4];
let currentLine = 1;
while (r < n && c < n) {
if (currentLine % 2) {
r += rDiff;
c += 1;
rDiff += diff;
} else {
r += 1;
c += cDiff;
cDiff += diff;
}
currentLine += 1;
}
return getPos(r, c, n, currentLine);
};
const answer = solution(n);
console.log(answer);