티스토리 뷰
[JavaScript]2562, 최댓값, 그리고 최솟값, rl.on(), 배열 다루기
Vagabund.Gni 2023. 6. 28. 11:27목차
문제
9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
예를 들어, 서로 다른 9개의 자연수
3, 29, 38, 12, 57, 74, 40, 85, 61
이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.
입력
첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
출력
첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.
풀이
주어지는 숫자를 차례대로 배열에 넣고, 그 안에서 최댓값과 그 인덱스를 출력하는 문제이다.
자바스크립트에서 배열은 상당히 독특한 방식으로 입력과 연산을 다루는 것을 알게 되었다.
문제 자체는 별 거 없으나 새로 알게 된 지식들이 한 곳에 모여있는 문제라서 공부하는 겸 글을 적게 되었다.
굳이 정리하자면 알고리즘을 풀이하는 방식은 다음과 같다.
- 주어진 입력값을 전부 배열에 넣는다.
- 해당 배열에서 최댓값과 그 인덱스를 찾는다.
- 최댓값과 인덱스 + 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()은 다음과 같은 순서로 작성한다.
- 이벤트 등록: 'line', 'close', 'pause', 'resume' 등의 이벤트를 등록한다.
- 이벤트 핸들러 등록
rl.on()의 첫 번째 매개변수로 이름을, 두 번째 매개변수로 실행할 함수를 전달한다.
위의 예를 보자면 rl.on('line', (line) => {})가 그 예이다. - 핸들러 메서드 작성: 위에서 등록한 람다 표현식의 내부 로직을 작성한다.
- 이벤트 처리: 예를 들면 'line'이벤트에서 입력된 결과를 가지고 'close'에서 메서드를 작성해 알고리즘을 풀 수 있다.
- 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}`);
위 코드는 두 상수를 개행문자를 사이에 두고 띄어쓰기 없이 출력하는 내용을 담고 있다.
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[JavaScript]10813번, 공 바꾸기, 배열 초기화, 요소 위치 바꾸기 (0) | 2023.07.01 |
---|---|
[JavaScript]10810번, 공 넣기, 배열 선언 및 초기화, process.stdout.write() (0) | 2023.06.30 |
[Java+Python]2805번, K번째 수 (0) | 2023.06.29 |
[Java+Python]2110번, 공유기 설치 (0) | 2023.06.27 |
[JavaScript]2408번, 주사위 세 개 (0) | 2023.06.26 |
[JavaScript]14681번, 사분면 고르기 (0) | 2023.06.24 |
- Total
- Today
- Yesterday
- a6000
- 남미
- spring
- 기술면접
- 백준
- 칼이사
- BOJ
- 파이썬
- 여행
- RX100M5
- 세계일주
- 자바
- 맛집
- 세계여행
- Python
- java
- 유럽
- Backjoon
- 면접 준비
- 동적계획법
- 리스트
- 중남미
- 스트림
- 지지
- 알고리즘
- 스프링
- 야경
- Algorithm
- 세모
- 유럽여행
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |