2차 공부/TIL

24.06.05 new Set()

공대탈출 2024. 6. 5. 17:30

https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

해당 알고리즘 문제를 풀고 다른 사람의 답을 확인했을때 생긴 궁금증이었다.

 

내가 작성한 코드는 다음과 같다.

function solution(numbers) {
    var answer = [];
    for (let i = 0; i<numbers.length-1; i++) {
        for (let j = i+1; j<numbers.length; j++) {
            answer.includes(numbers[i]+numbers[j]) ? undefined : answer.push(numbers[i]+numbers[j])
        }
    }
    return answer.sort((a,b) => a-b);
}

중첩 반복문을 사용하여 answer 배열에 특정 숫자의 합이 있는지 판단하고 있다면 넣지않고, 없다면 추가하여

최종적으로 오름차순 정렬을 return하는 함수를 작성하였다.

 

 

반면, 다른 사람이 작성한 코드는 다음과 같다.

function solution(numbers) {
    const temp = []

    for (let i = 0; i < numbers.length; i++) {
        for (let j = i + 1; j < numbers.length; j++) {
            temp.push(numbers[i] + numbers[j])
        }
    }

    const answer = [...new Set(temp)]

    return answer.sort((a, b) => a - b)
}

모든 합을 배열에 넣고 Set을 사용하여 중복수를 없앤 뒤 정렬하는 방식이다.

 

 

내가 작성한 코드는 includes를 사용하였다.

탐색하려는 배열의 시작부터 끝까지 모든 요소를 검사하는 메서드이다. 이는 배열의 데이터가 많아질수록 걸리는 시간이 많이 길어지는 단점이 있다.

하지만 장점도 있다. includes를 사용했기 때문에 코드가 직관적이다.

 

반면 타인이 작성한 코드는 includes를 사용하지 않고 중복값을 없애주는 Set을 사용했기 때문에 계산시간이 적으며, 데이터가 많아지더라도 내 코드보다 우수하다.

하지만, 중복을 검사하는 의도가 직관적으로 드러나지 않는다. 또한 temp와 Set을 사용하여 메모리를 더 할당해야한다.

 

뭐가 좋은 코드일까?

때에 따라 다르다고 생각한다.

데이터가 적은 계산에는 직관성을 높인 includes가, 데이터가 많은 계산에는 Set을 사용한 코드가 적합하다.

Set을 나만 모를수도 있는 것이고, 다른사람들은 다 알수도 있으니 '내가 몰랐다고 직관적이지 않다'라 판단하는건 이를수도있다.

'2차 공부 > TIL' 카테고리의 다른 글

24.06.10 숫자기억게임 페이지 만들기  (0) 2024.06.10
24.06.07 PostgreSQL  (0) 2024.06.07
24.06.04 콘솔 적극 활용하기  (0) 2024.06.04
24.06.03 JS 톺아보기  (0) 2024.06.03
24.05.31 배열과 연결 리스트(NodeList)  (0) 2024.05.31