본문 바로가기
JavaScript/프로그래머스

[프로그래머스] Level01. x만큼 간격이 있는 n개의 숫자

by JiaLee0707 2022. 10. 19.
프로그래머스
문제: https://school.programmers.co.kr/learn/courses/30/lessons/12954
코드: https://github.com/Mirim-Study/Algorithm/pull/443

 

문제

x만큼 간격이 있는 n개의 숫자

 

<문제 설명>

함수 solution 정수 x 자연수 n을 입력 받아, x부터 시작해 x 증가하는 숫자를 n 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution 완성해주세요.

 

<제한사항>

  • x는 -10000000 이상, 10000000 이하인 정수입니다.
  • n 1000 이하인 자연수입니다.

 

<입출력 예>

x n answer
2 5 [2,4,6,8,10]
4 3 [4,8,12]
-4 2 [-4, -8]

풀이 (1)

1. x부터 시작해 x 증가하는 숫자

x로 시작해서 x를 계속해서 더하면 된다.

x + x

 

2. n개 지니는 리스트

n개를 지니는 리스트라는 말은 1번을 n번 반복하며 리스트에 저장하면 된다.

 

3. 덧셈 -> 곱셈

덧셈으로만 문제를 해결하려고 하면 이중 반복문(다중 반복문)을 사용해야 한다.

하지만 1번과 2번을 함께 생각해보면 덧셈(1번)의 반복(2번)은 곱셈으로 생각할 수 있다.

 

function solution(x, n) {
    const answer = [];
    for (let i = 1; i <= n; i++) {
        answer.push(x*i)
    }
    return answer;
}

 

풀이 (2)

1번 풀이는 결괏값으로 사용할 변수를 빈 배열로 초기화를 하고 반복문을 통해 값을 채워나간다.

그렇지만 문제에서는  'n 지니는 리스트'라고 배열의 길이가 정해져 있다.

 

그래서 Array() 생성자, keys() 함수스프레드(spread) 연산자를 이용해서

배열을 생성과 동시에 초기화를 먼저 할 수 있다.

- [...Array(n).keys()]

 

Array() 생성자의 매개변수에 숫자를 넣을 경우, 그 길이의 배열을 생성해주고,

keys() 함수는 배열에서 사용하면 배열의 각 인덱스를 키 값으로 가지는 배열을 반환해준다.


* 중요한 점!

Array() 생성자로 배열을 생성할 경우,

배열이 생성되며 우리가 흔히 지정하지 않은 값, undefined로 채워진다고 생각할 수 있지만

매개변수에 숫자를 넣어 길이를 정해주면 그 길이만큼의 자리가 생기는 것이지 값이 채워지지는 않는다.

 

스프레드 연산자를 사용하면 이름에서도 알 수 있듯이 객체 또는 배열을 펼칠 수 있다.

이렇게 Array() 생성자로 배열을 생성하고 스프레드 연산자를 사용하면 배열이 펼쳐지지만

값이 채어지지 않았던 배열을 펼치기 때문에 이때 undefined로 배열이 펼쳐진다.

 

그리고 펼쳐진 값을 다시 [](대괄호)로 묶어주는 것이다.


이후, map() 함수를 사용하여 배열의 요소에 접근하며 곱셈을 처리하면 된다.

이때 배열의 인덱스(Index) 값을 통해 반복 횟수를 확인할 수 있으므로 곱셈을 처리해준다.

(인덱스는 0부터 시작하므로 꼭 1을 더해줘야 한다)

 

그리고 map() 함수는 모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환함으로

반환된 새로운 배열을 바로 return 해주면

1줄로 문제를 해결할 수 있게 된다.

 

function solution(x, n) {
    return [...Array(n).keys()].map((value, index) => x * (index + 1));
}

 

 

댓글