알고리즘 문제 풀이

[Node.js] Baekjoon 3052 나머지 풀이

SuhyeokRoh 2024. 5. 30. 19:32
숫자 10개를 입력받아 이를 42로 나눈 서로 다른 나머지 값의 개수를 구하여라.

 

접근 방식

0이 42개 있는 array를 생성 후, 입력받은 값을 42로 나눈 값에 해당하는 인덱스에 1씩 더한다.

이 후 array에서 0보다 큰 값이 있는 인덱스의 개수를 구해 출력한다.

 

구현 코드

let rl = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout,
})

let input = [];

rl.on('line', li=>{
    input.push(Number(li.trim()));
}).on('close', _ => {
    remainder(input);
    process.exit();
});

function remainder(lst) {
    let arr = Array(42).fill(0);
    
    lst.forEach(el => {
        arr[el%42]++;
    })
    
    const rst = arr.reduce((acc, cur) => {
        if(cur > 0) {
            return acc + 1; 
        } else {
            return acc
        }
    }, 0)
    
    console.log(rst)
}​

 

입력받는 숫자를 파일에서 읽는 과정은 이전 Node.js 입력받는 방법 포스팅 참조

 

  1. 숫자를 입력받을 때, trim 함수를 통해 공백이나 불필요한 문자열 제거 후, 숫자로 변환하여 array에 추가
  2. 입력받은 숫자가 들어있는 array를 forEach를 통해 요소 하나씩 돌아가며 나머지 계산
  3. reduce문을 활용하여 현재 값이 0보다 크면(해당 인덱스의 값에 해당하는 나머지가 존재) 개수 값에 1을 추가
  4. 결과값을 출력 후, process 종료

서로 다른 나머지 값의 개수을 계산할 때, reduce 함수가 아닌 forEach 함수를 통해서도 구할 수 있지만 하나의 값을 반환한다는 점에서 reduce 함수를 적용했음

Reduce 함수

reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.

구문

    arr.reduce(callback[, initialValue])

 

callback

 - 배열의 각 요소에 대해 실행할 함수, 4가지 인수를 받음

  1. Accumulator
    • 콜백의 반환값을 누적
    • 콜백의 이전 반환값 또는 콜백의 첫 번째 호출이면서 initialValue를 제공한 경우에는 initialValue 값
  2. currentValue
    • 처리할 현재 요소
  3. currentIndex
    • 처리할 현재 요소의 인덱스
    • initialValue를 제공한 경우 0, 아니면 1부터 시작함
  4. Array
    • reduce를 호출한 배열

initailValue

 - callback의 최초 호출에서 첫 번째 인수에 제공하는 값으로, 초기 값을 제공하지 않으면 배열의 첫 번째 요소를 사용함.

(빈 배열에서 초기값없이 reduce 호출 시, 오류 발생)

 


참고 사이트

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

 

Array.prototype.reduce() - JavaScript | MDN

reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.

developer.mozilla.org