티스토리 뷰

728x90
반응형

목차

     

    문제

     

    도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 

    또, 1번부터 N번까지 번호가 적혀있는 공을 매우 많이 가지고 있다. 

    가장 처음 바구니에는 공이 들어있지 않으며, 바구니에는 공을 1개만 넣을 수 있다.

    도현이는 앞으로 M번 공을 넣으려고 한다. 

    도현이는 한 번 공을 넣을 때, 공을 넣을 바구니 범위를 정하고, 정한 바구니에 모두 같은 번호가 적혀있는 공을 넣는다. 

    만약, 바구니에 공이 이미 있는 경우에는 들어있는 공을 빼고, 새로 공을 넣는다. 

    공을 넣을 바구니는 연속되어 있어야 한다.

    공을 어떻게 넣을지가 주어졌을 때, M번 공을 넣은 이후에 각 바구니에 어떤 공이 들어 있는지 구하는 프로그램을 작성하시오.

     

    입력

     

    첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

    둘째 줄부터 M개의 줄에 걸쳐서 공을 넣는 방법이 주어진다. 

    각 방법은 세 정수 i j k로 이루어져 있으며, 

    i번 바구니부터 j번 바구니까지에 k번 번호가 적혀 있는 공을 넣는다는 뜻이다. 

    예를 들어, 2 5 6은 2번 바구니부터 5번 바구니까지에 6번 공을 넣는다는 뜻이다. (1 ≤ i ≤ j ≤ N, 1 ≤ k ≤ N)

    도현이는 입력으로 주어진 순서대로 공을 넣는다.

    출력

     

    1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다. 공이 들어있지 않은 바구니는 0을 출력한다.

     

    풀이

     

    공이 들어있지 않은 바구니는 0을 출력해야 하기 때문에, 배열의 크기가 정해지면 해당 배열의 값을 0으로 초기화할 필요가 있다.

     

    대충 알아보니 배열의 크기를 가지고 모든 인덱스의 값을 0으로 초기화하는 방법은 무척 많으나,

     

    나는 그중 가장 간단해 보이는 것으로 골랐다.

     

    문제에서 사용한 선언 및 초기화 부분만 잘라보면 아래와 같다.

    ...
    let baskets = [];
    
    rl.on('line', (line) => {
        if (n === 0) {
            [n, m] = line.split(' ').map(Number);
            baskets = Array(n + 1).fill(0);
            }
    ...

    먼저 함수 바깥에서 배열을 선언해 준 뒤, n의 값이 정해지고 나면 위와 같이 초기화한다.

    baskets = Array(배열의 크기).fill(초깃값);

    보통 배열을 선언할 때 크기도 함께 선언해야 하는 자바나,

     

    선언과 동시에 초기화를 하는 것이 일반적인 파이썬과는 다소 다르지만,

     

    굳이 비교하자면 자바와 비슷한 함수 사용이라는 느낌이 들었다.

     

    이어서 이 문제에서 새로 만난 아이가 있는데, 바로

    process.stdout.write(`${baskets[i]} `);

    이다.

     

    console.log()와 비슷하게 출력을 다루지만, 이 아이는 자동 줄바꿈이 없어서 필요하면 직접 입력해야 한다고 한다.

     

    배열의 수를 연속으로 처리하는데에는 파이썬 만큼은 아니지만 꽤나 유용해 보인다.

     

    계속해서 문제를 푸는 알고리즘에 대해 알아보자.

     

    1. 표준 입출력 모듈 'readline'을 사용해 인터페이스를 선언한다.
      지난 글에 적었듯이 이렇게 하면 rl.on에서 'line', 'close'등을 사용할 수 있다.
    2. 바구니의 개수(+1)를 저장할 n과, 작업 횟수를 저장할 n, m, 그리고 결과를 저장할 바구니 배열 baskets를 선언한다.
    3. 입력의 첫 줄을 이용해 n, m, baskets를 초기화해 준다. 여기서 크기가 n+1인 이유는 작업 바구니의 번호가 1부터 시작하기 때문이다.
    4. 두 번째 줄 이후로는 주어진 입력을 분해해 i, j, k로 변환한다. 각 숫자는 시작 인덱스, 끝 인덱스, 바구니에 넣을 값을 가리킨다.
    5. 반복문을 돌며 baskets[x] = k; 를 이용해 작업을 완료한다.
    6. m--;를 통해 작업의 남은 개수를 하나 줄여준다.
    7. 같은 방식으로 m === 0 이 될 때까지 반복한 후, 연산이 완료되면 입력을 종료한다.
    8. 입력이 종료되면 rl.on('close', () => {})를 이용해 함수를 호출한다.
    9. 해당 함수는 최종 결괏값이 들어있는 baskets를 순회하며 값을 출력하는 기능만 가지고 있다.
    10. 출력이 끝나면 process.exit(0)을 사용해 프로그램을 종료한다.

    내가 아직 자바스크립트에 익숙하지 않아서 그런지 설명이 쓸데없이 긴 느낌이 있다.

     

    자꾸 하다 보면 괜찮아지겠지.

     

    JavaSctipt

     

    const rl = require('readline').createInterface({
        input: process.stdin,
        output: process.stdout,
    });
    
    let n = 0;
    let m = 0;
    let baskets = [];
    
    rl.on('line', (line) => {
        if (n === 0) {
            [n, m] = line.split(' ').map(Number);
            baskets = Array(n + 1).fill(0);
        } else {
            const [i, j, k] = line.split(' ').map(Number);
    
            for (let x = i; x <= j; x++) {
                baskets[x] = k;
            }
            m--;
    
            if (m === 0) {
                rl.close();
            }
        }
    }).on('close', () => {
        for (let i = 1; i <= n; i++) {
            process.stdout.write(`${baskets[i]} `);
        }
        process.exit(0);
    });
    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/09   »
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30
    글 보관함