✏️ 문제 설명
[연속된 수의 합] : https://school.programmers.co.kr/learn/courses/30/lessons/120923
[x만큼 간격이 있는 n개의 숫자] : https://school.programmers.co.kr/learn/courses/30/lessons/12954?language=javascript
비슷한 문제 풀이라 묶어봤다.
✏️ 문제 풀이 - 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를 만들 수 있다.
- 유사 배열 객체 (length 속성과 인덱싱 된 요소를 가진 객체)
- 순회 가능한 객체 (en-US) (Map, Set 등 객체의 요소를 얻을 수 있는 객체)
📌 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() 생성자는 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?
😀 공부하면서 적는 글입니다. 피드백과 공감 환영합니다.
'Algorithms > 코테 문풀' 카테고리의 다른 글
[프로그래머스] 가장 가까운 같은 글자 - JavaScript / Stack (0) | 2023.01.18 |
---|---|
[프로그래머스] 과일 장수 - JavaScript (0) | 2023.01.18 |
[프로그래머스] 문자열 내 p와 y의 개수 - JavaScript / 대소문자 구별없이 특정 문자 개수 세기 (0) | 2023.01.15 |
[프로그래머스] 문자열 밀기 - JavaScript (0) | 2023.01.14 |
[프로그래머스] 옹알이(1) - JavaScript / 정규 표현식 활용 (0) | 2023.01.13 |