캐또's coding

1193 - 분수찾기 - node.js 본문

기초 공부/백준 문제 풀이

1193 - 분수찾기 - node.js

JS_K_coding 2022. 8. 24. 11:13

https://www.acmicpc.net/problem/1193

 

1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net


문제 이해가 어려워서 처음에 시간이 오래 걸렸는데 간단히 보자면,

지그재그는 위 그림과 같은 지그재그를 말하는 것이었다. 예제에서 4는 3/1이고 5는 2/2고 6은 1/3이었는데,

위의 파란 글씨로 순서를 써 둔 것을 보면 왜 그런 결과가 나오는 것인지 이해할 수 있을 것이다. 

 

대각선 줄을 기준으로 몇 번째 줄에 있는지를 보면서 규칙을 찾을 수 있다. 분자와 분모(혹은 이 말 때문에 혼란이 온다면 각 칸에 담긴 숫자 A, B라고 칭해도 좋다.

짝수 번째 줄에서 분자는 ++, 분모는 --

홀수 번째 줄에서 분자는 --, 분모는 ++

해당하는 분수 (왼쪽부터 오른쪽으로 가는 순서)
첫 번째 1 / 1        
두 번째 1 / 2 2 / 1      
세 번째 3 / 1 2 / 2 1 / 3    
네 번째 1 / 4 2 / 3 3 / 2 4 / 1  
다섯 번째 5 / 1 4 / 2 3 / 3 2 / 4 1 / 5
const input = Number(require("fs").readFileSync("/dev/stdin").toString().trim());
let line = 1;
let nums = 1;
let 분자 = 1;
let 분모 = 1;
while (input > nums) {
  nums += 1 + line++;
}
if (line % 2 == 0) {
  분자 = line - (nums - input);
  분모 = nums - input + 1;
  console.log(`${분자}/${분모}`);
} else {
  분자 = nums - input + 1;
  분모 = line - (nums - input);
  console.log(`${분자}/${분모}`);
}

지그재그의 모양 등을 생각하기보다 위의 표와 같이 정리한 것대로 작성했을 때, 결국 분수들의 총 갯수에 따라서 반복문을 멈추면서 line을 ++해준다 (바로 이전 문제에서 사용한 방법과 동일)

반복문을 돌고 나면? 일정 범위에 따라 멈추기 때문에 당연히 line이 몇인지 나온다.

몇 번째 줄인지 알았다면 그 안에서 다시 어떤 분수인지 찾아야 하는데, 짝수와 홀수에 따라서 각각 반대로 분자와 분모를 도출할 수 있다.

예를 들어, 입력값이 9라면? 
해당 번호는 네 번째 줄이다. 
nums - input은 전체 숫자에서 입력으로 들어온 값을 빼는 것인데, 이 값은 마치 인덱스처럼 그 줄의 0~해당 라인.length만큼 나오게 된다.
==> 이것을 계산에 넣어보면??  값은 3/2
분자는 line - (nums - input)의 값 그러니까 4 - (10 - 9) = 3이 된다. 
분모는 nums - input + 1의 값 그러니까 10 - 9 + 1 = 2가 된다.

 

Comments