.forEach( ) 는 값을 모으지 않는다...!

Ju-jh·2024년 1월 29일
0

method

목록 보기
4/8
const inputData = require('fs').readFileSync(0, 'utf8').toString().trim().split('\n').map(Number)

const maxNumber = Math.max(...inputData)

const result = inputData.forEach((num, idx) => {
  if (Number(num) === maxNumber) {
    idx
  }
});

console.log(maxNumber)
console.log(result);

https://www.acmicpc.net/problem/2562

해당 백준 문제를 풀다가 forEach를 사용하여 배열을 순회하면서 최댓값을 구한 후 최댓값이 있는 배열의 index를 같이 반환하는걸 풀고있다가

계속 오류가 나서 무엇이 문제인지 확인하고있었다.

그러다가 찾은 명쾌한 답이 있었다.

forEach는 값을 모으고 있지 않다는 것...!

예를 들어서

inputData = [10, 30, 20, 13, 42, 45, 23, 31, 33] 
const maxIdx = inputData.forEach((num, idx)=>{
	if(num === maxNumber){
    	idx
    }
})

를 하더라도 maxIdx 는 undefined 이다. 왜냐?

forEach() 메소드는 콜백 함수에서 반환하는 값들을 모으지 않고,

단순히 각 요소에 대해 함수를 실행한다.

따라서 forEach() 메소드 자체가 반환하는 값은 언제나 undefined인 것이다.

그렇다면 어떤 다른 방법이 있을까?

그렇다 let으로 maxIds를 먼저 선언하고 선언한 변수에 값을 할당해주면 된다.

let maxIdx
...
const maxIdx = inputData.forEach((num, idx)=>{
	if(num === maxNumber){
    	maxIdx = idx
    }
})

이런식으로 할당할 수 있다.

따라서

const inputData = require('fs')
  .readFileSync(0, 'utf8')
  .toString()
  .trim()
  .split('\n')
  .map(Number);

const maxNumber = Math.max(...inputData);

let maxIndex;

inputData.forEach((num, idx) => {
  if (num === maxNumber) {
    maxIndex = idx + 1;
  }
});

console.log(maxNumber);
console.log(maxIndex);

이와 같은 출력을 해볼 수 있다.

번외로

indexOf()를 활용하면 더 간단하게 할 수 있다.

const inputData = require('fs')
  .readFileSync(0, 'utf8')
  .toString()
  .trim()
  .split('\n')
  .map(Number);

const maxNumber = Math.max(...inputData);

const idx = inputData.indexOf(maxNumber) + 1;

console.log(maxNumber);
console.log(idx);
profile
Node.js 개발자

0개의 댓글