[JS] BOJ 3053번 나머지

yeopto·2022년 1월 13일
0

Algorithm

목록 보기
4/11
post-thumbnail

출처

BOJ

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

문제

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

나의 풀이

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');

const answerNum = [];

solution();

function solution() {
    input.forEach((x) => {
        const num = x % 42;

        if (answerNum.indexOf(num) === -1) {
            answerNum.push(num);
        }
    });

    console.log(answerNum.length);
}

trim()을 안했을 때 틀렸다고 나왔다. 입력받을 때 공백이 있다고 함. 공백을 지워주기 위해 trim() 사용 → forEach는 각 배열의 요소마다 한 번씩 주어진 함수를 실행함. input요소들을 각각 한 번씩 42로 나눈 나머지를 num으로 선언해줌→ indexOf는 매개변수가 배열안에 있는지 확인하는 메서드임 없으면 -1을 반환함. → 반환 값이 -1이면 배열안에 없는 것이니 answerNum에 요소를 push해줌 → 만약 매개변수와 같은 수가 배열에 있다면 0을 반환하게 되어 push하지 않음. → 그러면 중복되지 않는 나머지값들이 배열안에 남게 됨. → 그 배열의 길이가 서로 다른 나머지 값의 갯수와 같음.

다른 풀이 1

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');

const divNum = input.map(x => x % 42);

solution();

function solution() {
    "use strict";
		const set = new Set(divNum);
    const answer = [...set];
    console.log(answer.length);
}

map으로 input 요소들을 42로 나눈 나머지의 수들의 새로운 배열로 만들어 줌. → Set객체는 ES6에 등장한 새로운 데이터 객체. Set은 unique한 값만 저장할 수 있도록 하기 때문에 Array에 넣게되면 중복값이 사라짐. → map으로 새로만든 배열의 중복값을 없애주기 위해 new Set(divNum)을 해주고 그 객체를 배열 answer에 전개연산자로 선언해줌. answer의 길이가 바로 서로 다른 값의 갯수와 같음.


둘 다 시간과 메모리가 거의 같음.

profile
https://yeopto.github.io로 이동했습니다.

0개의 댓글