단순 반복문으로는 시간초과가 난다.
규칙을 찾아야하는데
1/1
1/2 2/1
3/1 2/2 1/3
1/4 2/3 3/2 4/1
1,2,3,4 ...n 으로 각 줄마다 그룹핑을해준다면, n번째그룹이 짝수일경우 분모는 1부터 n까지 분자는 n부터 1까지 n만큼의 요소들을 가진다.
따라서 입력값이 몇 번째 그룹에 속해있는지 찾는것이 이번문제의 키였다.
let input = fs.readFileSync(filePath()).toString().trim();
let X = Number(input);
groupCounter = 0;
// 각그룹은 groupCounter 만큼의 요소를 갖고있고
// groupCounter 가 짝수이면 분모는 1부터 groupCounter까지 분자는 groupCounter부터 1까지이다
const 오름차순 = [];
const 내림차순 = [];
while(X > 0){ // While문을 돌려서 몇번째 그룹인지 체크한다, 1번째 그룹인지부터 체크하면서 해당그룹이 아닐시 input 값에서 그 그룹을 빼준다. 만약 반복해서 빼주다가 input값이 0또는 음수가된다면, 그 그룹에 해당하는것이다.
// ex) input 11 이면 group 1 11-1, 2 10-2, 3 8-3, 4 5-4, 5 1-5
// 그룹은 5번째그룹이고, input은 -4가됐다 해당그룹을 다시 더해주면 해당그룹의 몇번째인지도 알수있다. 5번째그룹이고 그룹의 첫번째 분수이다.
groupCounter ++;
X = X - groupCounter;
}
// console.log(X, groupCounter)
for(let i=0; i < groupCounter; i++){
오름차순.push(i+1);
내림차순.push(groupCounter-i);
}
if(groupCounter % 2 === 0){
console.log(`${오름차순[X+groupCounter-1]}/${내림차순[X+groupCounter-1]}`)
} else {
console.log(`${내림차순[X+groupCounter-1]}/${오름차순[X+groupCounter-1]}`)
}
/* 더좋은 풀이로는 짝수일때, 분모 출력을 groupCounter + X 로 해주면
해당 그룹의 끝 기준으로 자신의 순번을 찾는다.(12345 처럼 오름차순 기준이기 때문)
그리고 분자는 1 + (-X) 를 해주면 역시 그룹의 끝 기준으로 자신의 순번을 찾는다.( 54321처럼 내림차순이기 때문) */