본문 바로가기
Algorithms/코테 문풀

[프로그래머스] 연속된 수의 합, x만큼 간격이 있는 n개의 숫자 - JavaScript / Array.from 시퀀스 생성기

by hi-rachel 2023. 1. 16.

✏️ 문제 설명

[연속된 수의 합] : https://school.programmers.co.kr/learn/courses/30/lessons/120923

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[x만큼 간격이 있는 n개의 숫자] : https://school.programmers.co.kr/learn/courses/30/lessons/12954?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

비슷한 문제 풀이라 묶어봤다. 

 


 

✏️ 문제 풀이 - 1

[연속된 수의 합]

- 풀이 1

function solution(num, total) {
    let start = Math.ceil(total / num - Math.floor(num / 2));
        
    return Array.from({length: num}, (_, i) => i + start);
}

total에서 num 값을 나눠주면 중간 값이 나오고

시작 값을 반으로 나눠 소수점을 내려준 값을 중간 값에서 빼주면 처음 시작 값이 나온다.

 

Array.from에 대한 mdn의 설명을 보면 다음과 같은 경우에는 Array.from()으로 새 Array를 만들 수 있다.

 

📌 Array.from과 화살표 함수 사용하기

// Using an arrow function as the map function to
// manipulate the elements
Array.from([1, 2, 3], x => x + x);
// [2, 4, 6]

// Generate a sequence of numbers
// Since the array is initialized with `undefined` on each position,
// the value of `v` below will be `undefined`
Array.from({length: 5}, (v, i) => i);
// [0, 1, 2, 3, 4]

 

📌 시퀀스 생성기(range)

// Sequence generator function (commonly referred to as "range", e.g. Clojure, PHP etc)
const range = (start, stop, step) => Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step));

// Generate numbers range 0..4
range(0, 4, 1);
// [0, 1, 2, 3, 4]

// Generate numbers range 1..10 with step of 2
range(1, 10, 2);
// [1, 3, 5, 7, 9]

// Generate the alphabet using Array.from making use of it being ordered as a sequence
range('A'.charCodeAt(0), 'Z'.charCodeAt(0), 1).map(x => String.fromCharCode(x));
// ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]

 

- 풀이 2

function solution(num, total) {
    const a = (2 * total / num + 1 - num) / 2
    return Array(num).fill().map((_, i) => i + a)
}

 

Array() constructor

Array() 생성자는 Array 객체를 생성하는 데 사용된다.

new Array(element0, element1, /* … ,*/ elementN)
new Array(arrayLength)

Array(element0, element1, /* … ,*/ elementN)
Array(arrayLength)

이렇게 Array(arrayLength)로 생성하면 arrayLength만큼 빈 값으로 채워져 생성된다.

📌 arrayLength는 생성자에 전달된 유일한 인수가 0과 2**32 - 1(포함) 사이의 정수인 경우 해당 length 속성이 해당 숫자로 설정된 새 JavaScript 배열을 반환한다. (arrayLength만큼 빈 슬롯으로 이루어진 array - 희소 배열 참조)

 

▶ Array.prototype.fill()

fill() 메서드배열의 모든 요소를 시작 인덱스(기본값 0)에서 끝 인덱스(기본값 array.length)까지 정적 값으로 변경한다. 수정된 배열을 반환한다.

// Syntax
fill(value)
fill(value, start)
fill(value, start, end)

const array1 = [1, 2, 3, 4];

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

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

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

 

 


 

✏️ 문제 풀이 - 2

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

 

- 내풀이

function solution(x, n) {
    let arr = Array.from({length: n+1}, (_, i) => i * x);
    return arr.splice(1, n);
}

 

array를 생성하면 시작값이 0이기 때문에 +1을 더해 잘라주는 방법을 썼다.

=> 초기값부터 1로 설정하는 방법이 있다면 알려주세요 🙌🏼

 

- 다른 풀이

function solution(x, n) {
    return Array(n).fill(x).map((v, i) => (i + 1) * v)
}

 

 

참고 사이트

mdn

How does `Array.from({length: 5}, (v, i) => i)` work?

 

 

😀 공부하면서 적는 글입니다. 피드백과 공감 환영합니다.