Algorithm/프로그래머스: 기초 트레이닝

[프로그래머스] 마지막 두 원소 (Javascript)

집으로 감자 2025. 2. 15. 12:03

문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

요구사항
정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

제한조건
- 2 ≤ num_list의 길이 ≤ 10
- 1 ≤ num_list의 원소 ≤ 9

입출력
num_list result
[2, 1, 6] [2, 1, 6, 5]
[5, 2, 1, 7, 5] [5, 2, 1, 7, 5, 10]

 

 

내가 생각한 로직

1. 인덱스를 이용해서 배열의 마지막에 있는 숫자와 바로 앞에 있는 숫자를 구한다.

2. 삼항연산자를 이용해서 num_list 마지막에 조건에 맞는 숫자를 넣어준다.

 

 

내가 구현한 코드

function solution(numList) {
    const lastIdx = numList.length - 1;
    const lastNum = numList[lastIdx]
    const beforeNum = numList[lastIdx - 1]
    lastNum > beforeNum ? numList.push(lastNum - beforeNum) : numList.push(lastNum*2);
    return numList;
}

한 줄로 코드를 작성해 버리기보다

코드를 여러 줄을 쓰게 되더라도 분명한 의미를 갖는 변수를  작성하는데 중점을 두었다.

처음 코드를 본 사람도 변수명만 보고 바로 이해할 수 있게 작성하고 싶었다.

 

function solution(numList) {
    numList[numList.length - 1] > numList[numList.length - 2] ? numList.push(numList[numList.length - 1] - numList[numList.length - 2]) : numList.push(numList[numList.length - 1]*2);
    return numList;
}

변수를 사용하지 않고 줄줄이 쓰게 되면 다음과 같이 되어 버린다.

옆으로 끝없이 넘기면서 코드를 읽어야 한다.

 

 

다른 해결방법

function solution(num_list) {
    const [a, b] = [...num_list].reverse();
    return [...num_list, a > b ? (a-b):a*2];
}

글을 쓰게 된 이유는 이 코드 때문이라고 말할 수 있다.

이렇게 생각해서 코드를 쓸 수 있다는 점에 놀랐었다.

배열을 뒤집어서 앞쪽에 있는 2개의 숫자를 바로 꺼내서 쓸 생각을 했다는 게 신기했다.

 

const [a, b] = [...num_list].reverse();

num_list의 순서를 뒤집어주면, 맨 마지막의 숫자가 맨 앞으로 오게 된다.

구조분해 할당을 통해 맨 마지막이었던 숫자와 바로 앞에 있던 숫자를 바로 꺼내올 수 있다.

 

 

반응형