ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 Node.js/Javascript] 1193번 분수찾기
    To infinity/Coding Practice 2021. 6. 29. 19:50

    2021.06.29

    Question

     

    1193번: 분수찾기

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

    www.acmicpc.net


    Answer code

    let fs = require('fs');
    let N = fs.readFileSync('/dev/stdin').toString().map(el=>+el)
    
    let line = 0;
    let maxValue = 0;
    
    //N의 범위의 최대값이 나올 때 까지
    while ( maxValue < N) {
        line++
        maxValue += line;
    }
    
    
    let idx = N - (maxValue - line);
    
    if (line % 2 == 0) {
        child = idx;
        parents =  (line + 1) - child;
    } else {
        child = ( line + 1 ) - idx;
        parents = ( line + 1 ) - child;
    }
    
    console.log( child + '/' + parents)
    

     


    How to solve?

     

    처음에 문제 제목을 봤을 때, 분수찾기라고 해서 물줄기가 뿜어져 나오는 분수 (fountain) 를 생각했다.

     

    해당 문제의 규칙을 찾는 것이 먼저가 되어야겠지.

     

    1. 분자값으로만 보자면 이 전 값에 순서대로 1,2,3,4....를 더해가는 것을 볼 수 있다.

    그 증가분은 라인넘버와 일치한다.

     

    2. 분자만 봤을 때 라인넘버 짝수를 기준으로는 순방향으로, 홀수는 기준으로는 역방향으로 숫자가 나열되고 있다.

     

    3. 각 라인의 합계액은 해당라인에 존재할 수 있는 값의 최대값이 되고, 최대값에서 증가분(라인넘버)를 빼면 해당라인의 최소값이 된다. 따라서, 주어진 수(input)에서 최소값을 차감하게 되면 그 수가 바로 해당라인에서 주어진 수가 존재하는 위치번호가 된다. (1부터 시작했을 때 인덱스 넘버)

     

    4. 2번에서 말했듯이 라인넘버가 짝수인지 홀수인지에 따라서 분자값을 산출하는 로직이 다르기에 조건으로 나눠서 각각 조건에 맞도록 넣어준다.

     

     

    Feedback

    //첫번째 시도. 배열 만들어서 reverse.
    let idx = N - (maxValue-increase);
    let parents = [];
    
    
    for ( i = 1; i <= increase; i++ ) {
        parents.push(i)
    }
    
    let parentsValue = parents[idx-1];
    let childValue = parents.reverse()[idx-1];
    
    //악.. reverse하니까 원본도 바뀌네...
    //변수에 넣어도 바뀌는구나..ㅠㅠ
    
    // 오 됐다.
    let result = childValue + '/' + parentsValue;
    
    console.log(result);*/
    

     

    첫번째 시도는 배열을 만들어서 해당 배열을 reverse시키면 될 것이라 생각했다.

    그런데 내가 여기서 간과한 사실은, 라인이 항상 순서대로 가는 것이 아니라 역방향으로 번갈아가며 돈다는 것이었다. (위에 풀이에서 2번설명)

     

    그래서 N의 최대범위나오는 것 까지는 동일한데, 그 다음작업을 위와같이 처리했다.

    근데 여기서 또 알게 된건 Array.prototype.reverse() 함수를 쓰게되면 원본배열이 함께바뀐다는 것이었다.

    그래서 혹시 다른 변수에 넣어서 해당 변수를 바꾸면 괜찮지 않을까? 라고 했지만 아 역시나 변수에 넣어도 원본이 바뀌었다.

    그래서, 최종적으로 생각한것은 원본배열을 먼저 다른 변수 안에 할당해서 값을 새로운 곳으로 고정시켜주고 아예 원본배열을 바꿔버렸더니 작동이 됐다.

    하지만 위에서 간과한 사실 때문에 오답^^ 역시, 문제를 제대로 파악하는 것이 가장 중요하다.

     

     

Designed by Tistory.