joyful
[Javascript] 3052번 나머지 - 백준코딩 본문
문제출처:https://www.acmicpc.net/problem/3052
3052번: 나머지
각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.
www.acmicpc.net
문제
두 자연수 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
풀이 1
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n').map(Number)
//[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
let restArr = input.map(input => input % 42);
//map함수를 사용해 42를 나눈 나머지들을 새로운 배열에 저장
const set = new Set(restArr);
//배열에 고유한 값만 담는 표준내장객체인 set객체를 이용해서 중복되는 값들 제거
restArr = [...set];
console.log(restArr.length);//그 길이를 출력
풀이 2
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n').map(Number).trim();
//[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
let restArr = [];
for(let i = 0; i < input.length; i++) { //input의 길이만큼 반복문을 돌린다.
const restNum = input[i] % 42;
//restNum 변수 안에 input 입력 값에서 42를 나눈 값을 저장한다.
if(restArr.indexOf(restNum) === -1) {
//indexOf 함수로 restArr 배열 안에 restNum을 찾아 없다면(-1이라면), restArr 배열에 넣는다.
restArr.push(restNum);
}
}
console.log(restArr.length) //길이를 출력한다
풀이 3 (1+2 짬뽕)
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n').map(Number).trim();
let restArr = [];
for(let i = 0; i < input.length; i++) {
const restNum = input[i] % 42;
restArr.push(restNum);
const set = new Set(restArr);
restArr = [...set];
}
console.log(restArr.length)
TIL
set객체
- set 생성자 함수를 만드는 객체
- 수학적 집합을 구현하기 위한 자료구조(교집합, 합집합, 차집합, 여집합 등을 구현할 수 있음)
- 중복되지 않는 고유한 값들의 집합
- -동일한 값을 중복하여 포함할 수 없음
- -요소 순서에 의미가 없음
- -index로 요소에 접근할 수 없음
예제
var mySet = new Set();
mySet.add(1); // Set { 1 }
mySet.add(5); // Set { 1, 5 }
mySet.add('some text'); // Set { 1, 5, 'some text' }
mySet.add(5); // Set { 1, 5, 'some text' } 5가 이미 있어서 추가 안됨
출처: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Set
trim()
- 문자열 좌우에서 공백을 제거하는 함수
풀이 2번에서는 풀이 1번과 다르게 trim()함수를 사용해야만 백준문제에서 통과가 됩니다!
왜일까요?
풀이 2번에서는 for문 안에서 input의 length값이 필요한데,
input 배열에 공백이나 엔터가 들어갈 경우 길이가 달라질 수 있기 때문에
공백을 제거해줘야 합니다.
배열의 길이를 이용해야 할 때,
특히 이번 문제처럼 제출하는 입력값에서 공백이나 엔터가 들어갈 수 있는 경우에
길이가 달라지는 것을 예방하기 위해 trim을 꼭 사용해야겠습니다!
'백준코딩' 카테고리의 다른 글
[Javascript] 5597번 과제 안 내신 분..? - 백준코딩 (2) | 2023.08.03 |
---|---|
[Javascript] 2562번 최댓값 - 백준코딩 (2) | 2023.07.31 |
[Javascript] 10813번 공 바꾸기 - 백준코딩 (0) | 2023.07.26 |
[Javascript] 10810번 공 넣기 - 백준코딩 (1) | 2023.07.20 |
[Javascript] 준비단계 - node.js 입출력 방법과 오류 해결법 - 백준코딩 (0) | 2023.06.10 |