정수 start와 end가 주어질 때, start에서 end까지 1씩 감소하는 수들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
0 ≤ end ≤ start ≤ 50
start | end | result |
---|---|---|
10 | 3 | [10, 9, 8, 7, 6, 5, 4, 3] |
입출력 예 설명
입출력 예 #1
10부터 3까지 1씩 감소하는 수를 담은 리스트는 [10, 9, 8, 7, 6, 5, 4, 3]입니다.
function solution(start, end) {
let result = []
for(let i = start; i >= 0; i--){
result.push(i)
if(i === end){
break
}
}
return result
}
for문이 순차적으로도 가능하지만 역반복도 가능하다.
i = start
로 할당해 주고 i
가 0
보다 크거나 같을 때까지 반복한다. 반복 될 때 마다 i-1
를 해준다.
만약 i
가 end 값과 같아 질 때 break
를 걸어 멈춰 준다.
초반에 전부 순회를 돌지만 해당 조건까지만 반복되게 만들면 되겠다 생각했다.
function solution(start, end) {
let result = []
for(let i = start; i >= end; i--){
result.push(i)
}
return result
}
그냥 처음 부터 i
가 end 값 보다 크거가 같을 때 까지로 for문을 변경해 주면
좀 더 간결하게 코드를 작성할 수 있다.
function solution(start, end) {
return Array.from(Array(start - end + 1), (_, i) => start - i);
}
Array.from()이라는 메서드는 처음 봐 가지고 왔다.
유사 배열 객체나 반복 가능한 객체를 얕게 복사해 새로운 Array 객체를 만든다.
// 기본 문법
Array.from(배열의 길이, 매핑 함수)
Array.from('foo')// ["f", "o", "o"]
Array.from([1, 2, 3], x => x + x) // [2, 4, 6]
Array() 메서드의 첫 번째 인자는 배열의 길이를 나타낸다.
현재
start - end + 1
인 값만큼 값이 채워져 있지 않은 배열이 생성된다start = 10, end = 3인 경우
10 - 3 + 1로 8길이의 값이 들어가지 않은 배열이 생긴다.
+1
을 해준 이유는 인덱스는 0부터 시작하기 때문이다.
매핑 함수는 배열의 각 요소에 적용된다.
여기서 _(언더스코어)
는 첫 번째 매개 변수인 현재 요소의 값을 사용하지 않겠다는 뜻이다.
start - i는 만약 start가 10인 경우 인덱스는 0부터 시작한다.
i = 0, start = 10 이면 10,
i = 1, start = 10 이면 9,
i = 2, start = 10 이면 8,
.
.
.
0이 나올 때 까지 반복해 반환해 준다.
_(언더스코어)
??
- 언더스코어는 실제 변수나 매개변수의 이름으로 사용되지 않고, 일반적으로 사용하지 않는 이름을 나타내기 위해 자리 표시자로 사용된다.
이제 코드를 해석하자면
1.Array(start - end + 1)
start부터 end까지 구할 배열의 길이를 계산한다.
2. Array.from()
메서드를 사용해 새로운 배열을 만들어 준다.
- 첫 번째 매개변수 : 1번에서 구한 배열
- 두 번째 매개변수 : 매핑할 함수
3. (_, i) => start - i)
start - i로 start가 0이 될 때까지 반복해 반환한다.(요소 값은 사용하지 않기에 언더스코어로 표현)
4. 반환된 값은 첫 번째 매개변수 배열에 하나씩 push되어 새로운 배열이 만들어진다.
어떤 사람은 fill
, map
메서드 사용해 작업한 분도 있었지만
Array.from()
메서드는 처음 접해 가지고 와봤다.
언더스코어의 의미도 이번 기회에 제대로 파악할 수 있었던거 같다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from
chat CPT