치춘짱베리굿나이스
[백준] 1193 본문
분수찾기
문제
무한히 큰 배열에 다음과 같이 분수들이 적혀있다.
이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.
X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.
출력
첫째 줄에 분수를 출력한다.
풀이
const fraction = () => {
let input = parseInt(
require("fs").readFileSync("/dev/stdin").toString().trim()
);
let left = 1;
let right = 1;
let n = 1;
let i = 1;
while (1) {
if (i === input) break;
if (n % 2 && left === 1) right = ++n;
else if (!(n % 2) && right === 1) left = ++n;
else {
left += n % 2 ? -1 : 1;
right += n % 2 ? 1 : -1;
}
i++;
}
console.log(`${left}/${right}`);
};
fraction();
반성회
규칙
- n은 몇 번째 대각선인지 나타냄
- n이 짝수일 경우 우상단에서 좌하단으로 이동
- n이 홀수일 경우 좌하단에서 우상단으로 이동
- i는 언제 반복문을 빠져나갈 지 결정
- 매 반복문마다 증가하며, 입력값과 같아지면 탈출
- left는 분수의 분자
- n이 짝수일 경우 1부터 시작하여 1씩 증가하며, 마지막엔 n이 된다
- n이 홀수일 경우 n부터 시작하여 1씩 감소하며, 마지막엔 1이 된다
- right는 분수의 분모
- n이 짝수일 경우 n부터 시작하여 1씩 감소하며, 마지막엔 1이 된다
- n이 홀수일 경우 1부터 시작하여 1씩 증가하며, 마지막엔 n이 된다
따라서
- n이 짝수일 땐
- right가 1이 되었을 때 n을 1 증가시키고, left를 ++n으로 초기화
- n이 홀수일 땐
- left가 1이 되었을 때 n을 1 증가시키고, right를 ++n으로 초기화
i가 입력값과 같아지면 반복문을 탈출하고, 그 때까지 계산된 left와 right (분자와 분모) 를 출력
'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글
[백준] 1011 (0) | 2022.02.11 |
---|---|
[백준] 10757 (0) | 2022.02.11 |
[백준] 1712 (0) | 2022.02.11 |
[백준] 1978 (0) | 2022.02.11 |
[백준] 4344 (0) | 2022.02.11 |
Comments