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 )

  1. 입력받은 n이 몇 번째 대각선에 포함되는지 찾은 후 대각선의 가로 혹은 세로 시작점 (a/1 또는 1/a 형태)의 순서와 n 번째 순서까지의 차이를 계산해서 정답 출력
  2. 대각선 : 첫번째 선 ( 1/1 ), 두번째 선 (1/2, 2/1), 세번째 선 (3/1, 2/2, 1/3) 
  3. 첫 번째 선에서 두 번째 선으로 이동할 때 가로 순서 증가량은 1, 세로 증가량은 2 이다.
  4. 두 번째 선에서 세 번째 선으로 이동할 때 가로 순서 증가량은 4, 세로 증가량은 1 이다.
  5. 홀수번째 선(= x)에서 짝수번째 선으로 이동할 때 가로는 항상 1 증가, 세로는 2 + 4 * (x/2)의 몫 씩 증가
  6. 짝수번째 선(= 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);