티스토리 뷰

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
링크
«   2025/04   »
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
글 보관함