본문 바로가기
알고리즘 Node.js

백준 2562문제. 최댓값

by 반갑조? 2025. 3. 10.

문제

문제: 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()는 새로운 배열을 만듦)