[프로그래머스-기초]마지막 두 원소

JiEun·2023년 5월 24일
0

코테/코플릿

목록 보기
19/56

마지막 두 원소

문제 설명

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

제한사항

2 ≤ num_list의 길이 ≤ 10
1 ≤ num_list의 원소 ≤ 9

입출력 예

num_listresult
[2, 1, 6][2, 1, 6, 5]
[5, 2, 1, 7, 5][5, 2, 1, 7, 5, 10]

입출력 예 설명

입출력 예 #1
마지막 원소인 6이 그전 원소인 1보다 크기 때문에 6 - 1인 5를 추가해 return합니다.
입출력 예 #2
마지막 원소인 5가 그전 원소인 7보다 크지 않기 때문에 5의 두 배인 10을 추가해 return합니다.

💻 내가 작성한 코드

function solution(num_list) {
    let num1 = Number(num_list.slice(-1).join(""))
    let num2 = Number(num_list.slice(-2, -1).join(""))
    return [...num_list, num1 > num2 ? num1 - num2 : num1 * 2]
}

slice를 이용해 뒤에 자리를 구하고 이를 join()해 문자열로 반환한 후 Number()를 이용해 숫자로 바꿔주었다.

삼항 연산자를 이용해 원하는 조건에 맞게 값을 반환해 주었다.

🛠️ 리팩토링 하기

function solution(num_list) {
    let num1 = +num_list.slice(-1)
    let num2 = +num_list.slice(-2, -1)
    return [...num_list, num1 > num2 ? num1 - num2 : num1 * 2]
}

너무 많은 메서드를 사용하고 있어 어떻게 하면 좀 더 간단하게 작성할 수 있을까? 하다가 단항 연산자 +를 이용해 숫자로 변환 할 수 있다는 점을 알았다.

단, [1, 2, 3, 4] 이런 식의 배열에 +[1, 2, 3, 4] 할 경우 NaN이 나오지만
하나의 값인 경우 +[3]은 숫자 3 을 반환한다.

배열의 값을 숫자로 변경하고 싶을 경우 map()메서드를 사용하면 된다.

단항 연산자 + ?

  • 숫자로의 강제 변환을 수행하는 연산자 (피연산자를 숫자로 변환하고 해당 값을 반환)
    - 숫자, 문자열인 경우 : 해당 숫자로 반환해 준다.
    문자열의 경우 숫자로 구성되어있지 않거나 공백이 포함 되어 있을 경우 NaN을 반환 한다.
    - boolean 값이 경우 : true = 1, false = 0으로 반환한다.
    - null, nudefinde인 경우 : null = 0, undefined = NaN으로 반환한다.

💻 다른 사람이 작성한 코드

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

const [a, b] = [...num_list].reverse();
reverse() 메서드를 사용해 배열을 역순으로 두고
구조분해 할당했다.

즉 a는 첫번째 값(맨 뒤에 있는 값), b는 두번째 값(뒤에서 2번째 값)이 할당된다.

예시 화면


✏️ 마치며

문제를 풀면서 역순으로 가져오면 되겠다 생각은 했지만.
reverse()가 떠오르지 않았다.

이상하게 배열에서 값을 추출할 때 slice()가 먼저 떠오르는 거 같다.

이런 점을 고쳐야 한다고 생각한다.
일단 문제를 풀고 더 나은 방향으로 리팩토링하되
다양한 방법을 시도해 봐야겠다.

profile
💻 프론트엔드를 목표로 성장 중! (알아봤던 내용 등을 정리하기)

0개의 댓글