티스토리 뷰

728x90
반응형

목차

     

    문제

     

    9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

    예를 들어, 서로 다른 9개의 자연수

    3, 29, 38, 12, 57, 74, 40, 85, 61

    이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

    입력

     

    첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

     

    출력

     

    첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

    풀이

     

    주어지는 숫자를 차례대로 배열에 넣고, 그 안에서 최댓값과 그 인덱스를 출력하는 문제이다.

     

    자바스크립트에서 배열은 상당히 독특한 방식으로 입력과 연산을 다루는 것을 알게 되었다.

     

    문제 자체는 별 거 없으나 새로 알게 된 지식들이 한 곳에 모여있는 문제라서 공부하는 겸 글을 적게 되었다.

     

    굳이 정리하자면 알고리즘을 풀이하는 방식은 다음과 같다.

     

    1. 주어진 입력값을 전부 배열에 넣는다.
    2. 해당 배열에서 최댓값과 그 인덱스를 찾는다.
    3. 최댓값과 인덱스 + 1을 출력한다.

    계속해서 코드를 보여 알게 된 것들을 정리하자.

     

    JavaScript

     

    const rl = require('readline').createInterface({
        input: process.stdin,
        output: process.stdout,
    });
    
    let input = [];
    
    rl.on('line', (line) => {
        input.push(parseInt(line));
    }).on('close', () => {
        const mx = Math.max(...input);
        const idx = input.indexOf(mx);
    
        console.log(`${mx}\n${idx + 1}`);
    
        rl.close();
    });

    코드에서 볼 수 있듯이 배열을 먼저 선언하고, rl.on()을 사용해 입력값과 그 이후의 연산을 진행한다.

     

    위에서부터 순서대로 읽어보자.

     

    rl.on()

     

    rl.on()은 Node.js의 'readline' 모듈(가장 첫 번째 줄에 호출한다)에서 제공하는 함수 중 하나로,

     

    이벤트 발생 시 처리 작업을 등록하고 그 안에서 핸들러 함수를 이용해 로직을 진행시킬 수 있다.

     

    여기서 이벤트의 종류는 대략 아래와 같다.

     

    • 'line'

      • 한 줄의 입력이 들어올 때마다 발생한다. 그러니까 입력이 끝날 때까지 반복해서 작업을 수행한다.
      • 이름처럼 한 줄의 데이터가 핸들러 메서드의 매개변수로 전달된다.
      • 주로 입력 데이터의 가공과 처리 용도로 사용된다.
    • 'close'

      • 입력이 종료되어서 인터페이스가 종료될 때 발생한다.
      • 핸들러 메서드에 별도로 매개변수가 전달되지 않는다.
      • 'line'에서 가공된 데이터로 작업을 수행하고 인터페이스를 닫는 등 종료 작업을 수행한다.
    • 'pause'

      • 입력 스트림이 일시적으로 정지되었을 때 발생한다.
      • 핸들러 메서드에 별도로 매개변수가 전달되지 않는다.
      • 사용자의 입력을 일시적으로 중지하고 특정 작업을 수행하기 위해 일시적으로 입력을 차단하는 데 사용된다.
    • 'resume'

      • 입력 스트림이 다시 시작되었을 때 발생한다.
      • 핸들러 메서드에 별도로 매개변수가 전달되지 않는다.
      • 'pause'를 사용해 일시적으로 멈춘 입력 스트림을 다시 활성화하는데 쓰인다.

    위와 같은 이벤트의 종류를 가지고 rl.on()은 다음과 같은 순서로 작성한다.

     

    1. 이벤트 등록: 'line', 'close', 'pause', 'resume' 등의 이벤트를 등록한다.
    2. 이벤트 핸들러 등록
      rl.on()의 첫 번째 매개변수로 이름을, 두 번째 매개변수로 실행할 함수를 전달한다.
      위의 예를 보자면 rl.on('line', (line) => {})가 그 예이다.
    3. 핸들러 메서드 작성: 위에서 등록한 람다 표현식의 내부 로직을 작성한다.
    4. 이벤트 처리: 예를 들면 'line'이벤트에서 입력된 결과를 가지고 'close'에서 메서드를 작성해 알고리즘을 풀 수 있다.
    5. rl.close(): 'close'에 의한 종료 로직이 완료되면 rl.close()를 호출해 인터페이스를 명시적으로 닫아준다.

     

    Array

     

    다음은 주어진 배열을 다루는 방법이다.

     

    먼저 배열에서 최댓값을 찾아보자. 위 코드에서 보듯이

    const mx = Math.max(...input);

    이런 식으로 ... 연산자를 사용해 배열 input을 전달해 주면 최댓값을 찾을 수 있다.

     

    너무나 당연하게도 최솟값은 아래와 같이 등록하면 되고,

    const mx = Math.min(...input);

    문제에 나오진 않았으나 배열의 정렬은 아래와 같이 입력하면 된다.

    const numbers = [4, 2, 7, 1, 5];
    numbers.sort(); // [1, 2, 4, 5, 7] -> 오름차순(기본)
    numbers.sort((a, b) => b - a); // [7, 5, 4, 2, 1] -> 내림차순

    또한, 해당 배열에서 특정 값의 인덱스를 구하려면 아래와 같이 입력하면 되고,

    const idx = input.indexOf(mx);

    추가로 출력값을 띄어쓰기 없이, 상수의 값을 출력하고 싶으면 아래와 같이 입력하면 된다.

    console.log(`${mx}\n${idx + 1}`);

    위 코드는 두 상수를 개행문자를 사이에 두고 띄어쓰기 없이 출력하는 내용을 담고 있다.

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/06   »
    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
    글 보관함