문제
문제: 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.
입력: 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
출력: 첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.
예제 입력: 3
29
38
12
57
74
40
85
61
예제 출력: 85
8
풀이
const a = require('fs').readFileSync(0, "utf-8").trim().split('\n').map(Number);
const b = Math.max(...a);
console.log(b);
console.log(a.indexOf(b)+1);
풀이 해석
1.
더 알아보기
1. console.log(b, a.indexOf(b) + 1); 이렇게 출력코드를 작성해도 정답으로 처리가 되는 이유는?
- 줄바꿈(\n)없이 쉼표로 출력했지만 JS의 console.log(a, b)는 자동으로 공백을 추가해서 출력하므로, 백준의 출력 형식과 일치했기 때문이다.
- 쉼표(,)를 사용하면 자동으로 공백( )이 추가된다.
- 줄바꿈(\n)이 필요없는 문제에서는 쉼표를 사용해도 문제없다.
- 하지만 줄바꿈이 필요한 문제에서는 console.log(a+\n+b);처럼 명확하게 처리해야한다.
- 즉, 백준이 요구하는 출력 형식이 '숫자 2개를 공백으로 구분해서 출력' 하는 형태였기 떄문에 정답으로 인정이 되었다.
2. 다른 메서드를 사용한 답
1. reduce()사용 (배열 메서드 연습)
const fs = require('fs');
const input = fs.readFileSync(0, "utf-8").trim().split('\n').map(Number);
const { maxVal, index } = input.reduce((acc, num, idx) =>
num > acc.maxVal ? { maxVal: num, index: idx + 1 } : acc,
{ maxVal: -Infinity, index: -1 }
);
console.log(maxVal);
console.log(index);
- 장점: 배열을 한 번만 순회하면서 최댓값과 인덱스를 찾음 (O(N)), 메모리 효율적 (스프레드 연산자 없이 동작)
- 단점: 초보자에겐 reduce()가 다소 어려울 수 있음
2. for반복문 사용 (메모리 절약형)
const fs = require('fs');
const input = fs.readFileSync(0, "utf-8").trim().split('\n').map(Number);
let maxVal = input[0];
let index = 1;
for (let i = 1; i < input.length; i++) {
if (input[i] > maxVal) {
maxVal = input[i];
index = i + 1;
}
}
console.log(maxVal);
console.log(index);
- 장점: 배열을 한 번만 순회하면서 최댓값과 위치를 찾음, 가장 기본적이고 직관적인 방식, 메모리 절약 가능 (Math.max(...input)보다 효율적)
- 단점: 코드가 길어짐
3. sort()사용 (비효율적인 방식)
const fs = require('fs');
const input = fs.readFileSync(0, "utf-8").trim().split('\n').map(Number);
const sorted = [...input].sort((a, b) => b - a);
const maxVal = sorted[0];
const index = input.indexOf(maxVal) + 1;
console.log(maxVal);
console.log(index);
- 장점: 코드가 직관적
- 단점: 비효율적 (정렬 O(N log N) 연산이 불필요함), 메모리 사용이 증가 (sort()는 새로운 배열을 만듦)
'알고리즘 Node.js' 카테고리의 다른 글
백준 10813문제. 공 바꾸기 (0) | 2025.03.11 |
---|---|
백준 10810문제. 공 넣기 (0) | 2025.03.11 |
백준 10818번. 최소,최대 (0) | 2025.03.09 |
백준 10871문제. X보다 작은 수 (0) | 2025.03.08 |
백준 10807문제. 개수 세기(4단계 시작) (0) | 2025.03.08 |