[JS] 3052 나머지 중복제거(Set/filter&indexOf)

    3052 나머지

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

    문제

    • 수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
    • 첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.
    • 첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.

    풀이

    const fs = require('fs');
    const inputData = fs
        .readFileSync(0,'utf8')
        .toString()
        .trim()
        .split('\n')
        .map((i) => parseInt(i))
    // inputData의 모든 수를 42로 나눈 나머지를 구함.
    const remainder = inputData.map((x) => x%42) 
    
    // set 배열을 사용해 중복을 제거함.
    const uniqueremainder = new Set(remainder);
    
    // 중복 제거한 나머지들의 개수를 셈.
    const uniqueremainderLength = [...uniqueremainder].length
    
    console.log(uniqueremainderLength)

    중복을 제거하는 방법

    1.set 객체 이용

    const array = [1,2,3,1,2];
    
    const result = [...new Set(array)]; //[1,2,3]
    const result2 = Array.from(new set(array)); //[1,2,3]

    Set은 유니크한 값만 가질 수 있습니다. 이를 이용하여 중복값이 있는 array를 Set객체로 만들어 중복을 제거합니다.

     

    전개 연산자를 이용하여 Set객체를 다시 배열로 만들거나 Array.from()을 사용하여 배열로 다시 변환합니다.

     

    2.filter함수와 indexof함수를 이용

    const array = [1,2,3,1,2];
    
    const result = array.filter((v,i) => array.indexOf((v) === i)); //[1,2,3]
    

    filter()는 callback함수를 호출해, true값을 반환하는 모든 값을 모아 배열 형태로 만듭니다.
    indexOf() 메서드는 중복된 요소가 있는 경우, 맨 앞의 요소의 index를 반환합니다.

    따라서, filter안에 콜백함수를 indexOf를 넣어 중복을 판단하고, 중복이 되지 않은 값만 반환하게 합니다.

     

    + 검사하고 있는 요소가 첫번째 인자값이면 index값과 일치하여 반환되고 만약 중복된 요소이면 index값과 달라 배열에 반환되지 않습니다.

     

    :speaker: 배열의 요소가 많으면 효율성이 떨어집니다.

     


    'algorithm > 백준' 카테고리의 다른 글

    [PYTHON] 1000 A+B 1001 A-B 10998 AXB 1008 A/B  (0) 2023.01.05
    [JS] 2562 최댓값  (0) 2022.09.09
    [JS] 1546 평균  (0) 2022.09.09
    [JS] 10818 최소,최대 for문/Math 메서드  (0) 2022.09.06
    [JS] 3003 킹, 퀸, 룩, 비숍, 나이트, 폰  (0) 2022.08.25

    댓글