[JS]백준 1193번 분수찾기

jsg_ko·2021년 12월 1일
0

코테연습

목록 보기
19/21

단순 반복문으로는 시간초과가 난다.
규칙을 찾아야하는데
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처럼 내림차순이기 때문) */


profile
디버깅에서 재미를 추구하면 안되는 걸까

0개의 댓글