두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다.
예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다.
그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다.
이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.
1
2
3
4
5
6
7
8
9
10
10
42
84
252
420
840
126
42
84
420
126
1
39
40
41
42
43
44
82
83
84
85
6
/*fs모듈로 입력값 받아오기.
입력값은 줄바꿈 단위로 나누고, trim()을 통해 공백을 제거했다(중요!)*/
var fs = require('fs');
var input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');
//map()메서드로 42로 나눈 나머지 값의 배열 반환
let arrNumber = input.map(x => x % 42);
//set 객체로 중복을 제거한 뒤 원소의 개수를
let set = new Set(arrNumber);
console.log(set.size);
1. map() 메서드
배열 내 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환한다.
이를 통해 input 배열에서 나머지를 쉽게 받아올 수 있었다.
2. trim()으로 input 배열의 빈 문자열 제거
\n
으로 나눈 값들로 input 배열을 만들 때, 입력값의 마지막에 \n
이 있어 빈 문자열로 함께 반환되었다.
예를 들어 예제입력 1은 1부터 10까지의 값을 줄 단위로 입력했는데, 만약 trim()을 넣지않는다면 console.log(input) = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", ""]
이 출력된다.
실제 입력값은 10개이지만, trim()으로 이를 제거하지 않으면 11개가 되어arrNumber 엘리먼트의 개수가 달라진다..! 😨
앞으로 입력값을 받아올 때 trim()을 함께 넣는 걸 생활화해야지.
충격받은 나머지 비슷한 사례를 적어 Velog에 trim() 포스팅을 남겨두었다.
3. set 객체로 배열의 중복 제거
Javascript에서 배열의 중복을 제거하는 방법은 여러가지가 있지만, 내게 가장 이해가 잘 되었던 방법은 let set = new Set(arrNumber);
형태와 같이 중복값이 있는 배열을 set 객체로 만들어서 중복을 제거하는 방법이였다. 덕분에 간단하게 중복 제거 해결!