Algorithm | x만큼 간격이 있는 n개의 숫자 문제

권기현·2021년 1월 31일
0

Algorithm

목록 보기
1/20
post-thumbnail

프로그래머스 Lv1

문제 설명

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

제한 조건

  • x는 -10000000 이상, 10000000 이하인 정수입니다.
  • n은 1000 이하인 자연수입니다.
xnanswer
25[2,4,6,8,10]
43[4,8,12]
-42[-4, -8]

나의 풀이

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

다른 풀이 #1

function solution(x, n) {
    return Array(n).fill(x).map((el,i) => (i+1) * x);
}
// i+1 -> i는 0부터 시작하기 때문

이 풀이에서 'Array(n).fill()' 으로 바꾸어 작성하여도 문제가 풀리기는 한다. 비록 'Array(n).fill()' 의 값이
[ undefined, undefined, undefined, undefined ]이긴 하지만. 데이터가 존재하지 않는 배열을 쓸 때에 어떤 문제가 있는지 더 살펴봐야겠다.

Array()와 fill(), map() 을 통해 풀었다.

- Array( ) 생성자 함수

: 배열을 생성하는데는 예전 방식인 new 명령을 사용하는 방법과 리터럴 표기법(literal notation) 을 사용하여 생성하는 방식이 있습니다. (출처)

: 배열은 일반적으로 배열 리터럴 방식으로 생성하지만 배열 리터럴 방식도 결국 내장 함수 Array() 생성자 함수로 배열을 생성하는 것을 단순화시킨 것이다.

: Array() 생성자 함수는 매개변수의 갯수에 따라 다르게 동작한다.
매개변수가 1개이고 숫자인 경우 ✅매개변수로 전달된 숫자를 length 값으로 가지는 빈 배열을 생성한다.

// 매개변수로 하나의 숫자를 가지는 경우
const arr = new Array(2);
console.log(arr); // (2) [empty × 2]

// 매개변수로 전달된 값들을 요소로 가지는 배열을 생성하는 경우
const arr = new Array(1, 2, 3);
console.log(arr); // [1, 2, 3]

- fill()

: 메서드는 배열의 시작 인덱스부터 끝 인덱스의 이전까지 정적인 값 하나로 채웁니다

arr.fill ( value [, start [, end]])

  • 매개변수
    • value
      : 배열을 채울 값.
    • start( Optional )
      : 시작 인덱스, 기본 값은 0.
    • end ( Optional )
      : 끝 인덱스, 기본 값은 this.length.
const array1 = [1, 2, 3, 4];

// fill with 0 from position 2 until position 4
console.log(array1.fill(0, 2, 4));
// expected output: [1, 2, 0, 0]

// fill with 5 from position 1
console.log(array1.fill(5, 1));
// expected output: [1, 5, 5, 5]

console.log(array1.fill(6));
// expected output: [6, 6, 6, 6]

- map()

map() 메서드는 배열 내의 모든 요소 각각에 대하여 ✅ 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다.

arr.map( callback ( currentValue [, index [, array ]])[, thisArg])

  • 매개변수
    • callback
      : 새로운 열 요소를 생성하는 함수. 다음 세 가지 인수를 가집니다.
    • currentValue
      : 처리할 현재 요소.
    • index ( Optional )
      : 처리할 현재 요소의 인덱스.
    • array ( Optional )
      : map()을 호출한 배열.
    • thisArg ( Optional )
      : callback을 실행할 때 this로 사용되는 값.

🌟 다른 풀이 #2

function solution(x, n) {
    return nNumbers(x,n);
}
const nNumbers = (x, n)=>{
    return Array.from({length: n},(v,index)=>(index+1)*x);
};

es6에 새로 도입된 Array.from()을 사용하여 문제를 풀었다.

- Array.from()

ES6에서 새롭게 도입된 Array.from 메소드는 유사 배열 객체(array-like object) 또는 이터러블 객체(iterable object) 를 변환하여 새로운 배열을 생성한다.

// 문자열은 이터러블이다.
const arr1 = Array.from('Hello');
console.log(arr1); // [ 'H', 'e', 'l', 'l', 'o' ]

// 유사 배열 객체를 새로운 배열을 변환하여 반환한다.
const arr2 = Array.from({ length: 2, 0: 'a', 1: 'b' });
console.log(arr2); // [ 'a', 'b' ]

// Array.from의 두번째 매개변수에게 배열의 모든 요소에 대해 호출할 함수를 전달할 수 있다.
// 이 함수는 첫번째 매개변수에게 전달된 인수로 생성된 배열의 모든 요소를 인수로 전달받아 호출된다.
const arr3 = Array.from({ length: 5 }, function (v, i) { return i; });
console.log(arr3); // [ 0, 1, 2, 3, 4 ]

다른 풀이#3

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

위의 코드를 보면 Spread문법을 사용한다. 그 이유는 Spread 문법을 이용하면 iterable 객체를 해체 할 수 있다.

- keys()

: 배열의 각 인덱스를 키 값으로 가지는 새로운 Array Iterator 객체를 반환합니다.
Array Iterator 객체를 반환하는 함수는 다음의 함수들이 있다.

const array1 = ['a', 'b', 'c'];
const iterator = array1.keys();

for (const key of iterator) {
  console.log(key);
}

// >0
// >1
// >2
----------------------------------
const arr = [...Array(5).keys()];
console.log(arr);

// >[ 0, 1, 2, 3, 4 ]

결론

ES6에서 Iterable protocol 이 추가 되었고, Iterable protocol의 2가지 형태로는 iterable 과 iterator 이 있다. 이 부분에 대해서는 아직 명확하게 이해를 하지 못하여서 따로 정리하여야겠다.

-- 새삼 느낀점 --
알고리즘을 풀어본 적은 없지만 lv1 이라서 쉽다고 생각하였고, 풀고 나서도 쉽다고 생각하였다. 하지만, 되도 않는 자만이었다.....
훨씬 간결하게 푼 코드를 통해 많은 공부와 자극이 된 것 같다. 또 어제 배운 함수형 프로그래밍을 사용한 예를 느낄 수 있었다.

profile
함께 일하고 싶은 개발자를 목표로 매일을 노력하고, 옷을 좋아하는 권기현 입니다.

0개의 댓글