정수 리스트 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
마지막 원소인 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()가 먼저 떠오르는 거 같다.
이런 점을 고쳐야 한다고 생각한다.
일단 문제를 풀고 더 나은 방향으로 리팩토링하되
다양한 방법을 시도해 봐야겠다.