정수 n과 k가 주어졌을 때, 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
1 ≤ n ≤ 1,000,000
1 ≤ k ≤ min(1,000, n)
n | k | result |
---|---|---|
10 | 3 | [3, 6, 9] |
15 | 5 | [5, 10, 15] |
입출력 예 설명
입출력 예 #1
1 이상 10 이하의 3의 배수는 3, 6, 9 이므로 [3, 6, 9]를 return 합니다.
입출력 예 #2
1 이상 15 이하의 5의 배수는 5, 10, 15 이므로 [5, 10, 15]를 return 합니다.
function solution(n, k) {
let result = []
for(let i = 1; i <= n; i++){
if(i % k === 0){
result.push(i)
}
}
return result
}
초반에 조건문을 n % k === 0
으로 했다.
왜 안되지? 해당 값중 나눴을 때 나머지가 0이면 배열에 추가하도록 했는데
왜 자꾸 안되지 고민했던거 같다.
n이 아닌 i를 주면서 하나씩 확인하는 방법으로 진행하니 풀어졌다.
const solution=(n,k)=>Array(~~(n/k)).fill(k).map((v,i)=>v*(i+1))
내가 처음 보는 문법도 보여서 가져와 봤다.
만약 n = 10, k = 3인 경우
1. 10을 3으로 나눈 몫은 3이므로 ~~(n/k)
2. 길이가 3인 배열이 생성된다. Array(~~(n/k))
3. 이 배열은 [3,3,3]으로 채워진다. Array(~~(n/k)).fill(k)
4. map()메소드를 사용해
[3 * (0+1), 3 * (1+1), 3 * (2+1), 3 * (3+1), 3 * (4+1)] = [3, 6, 9, 12, 15]
으로 변환한다. map((v,i)=>v*(i+1))
여기서 (i+1)를 준 이유는 인덱스는 0부터 시작해서 그런거 아닐까 싶다.(아닐 수 있음)
Array()
생성자는 새로운 Array를 생성할 때 사용한다.// 빈 배열 생성하기
let arr = new Array(2)
console.log(arr.length) // 2
console.log(arr[0]) // undefined
// 배열 생성
let arr = new Array(2, 3)
console.log(fruits.length) // 2
console.log(fruits[0]) // 2
console.log(fruits[1]) // 3
~~
문법은 소수 부분을 버리고 정수 부분만 반환한다.// 반올림, 내림 없이 소숫점을 버린다.
~~3.14 // 3
~~(-5.7) // 5
~~
연산자는 피연산자가 음수일 경우에도 소수점 이하를 버리기 때문에, Math.floor()와는 다른 결과를 내기도 한다.즉, ~~(n/k)
는 몫을 구하는 코드이다.
Array(~~(n/k))
여기 까지 보면
~~(n/k)에서 구해진 몫을 Array()생성자 함수를 통해 함수로 만들어 진다.
fill()
메서드는 배열의 모든 요소를 정적 값으로 채운다.array.fill(value, start, end)
value : 배열의 각 요소에 할당될 값
start : 채워넣기를 시작할 인덱스(기본 값 = 0)
end : 채워넣기를 끝낼 인덱스(채워 넣기가 종료될 인덱스 바로 전까지의 위치 - 기본 값 = 배열의 길이) (본인은 포함하지 않는다.)
// 모든 요소를 0으로 채운다.
const arr1 = [1, 2, 3, 4, 5];
arr1.fill(0); // [0, 0, 0, 0, 0]
// 1,2를 제외한 나머지를 0으로 채운다.
const arr2 = [1, 2, 3, 4, 5];
arr2.fill(0, 2); // [1, 2, 0, 0, 0]
// 1번째 부터 3번째까지 채운다.(4 본인은 포함하지 않는다. - 그 전 단계까지 포함한다.)
const arr3 = [1, 2, 3, 4, 5];
arr3.fill(0, 1, 4); // [1, 0, 0, 0, 5]
생소한 문법은 아직도 많은 거 같다.
프로그래머스를 하면서 다른 사람들이 어떻게 풀었는지 확인하면서
처음 보는 문법을 알아보고 기록하면 좋을 거 같다.
.
.
.
여담이지만 이부분이 이해가 되질 않아 다시 질문했는데
실수했다고 잘못을 인정하는 부분에 놀라웠다.
질문을 다는데도 바로 달지 않고 어디가 문제인지 곰곰히 생각하고 작성하는 느낌이였다...!
참고
chat GPT (GPT 없이 못사는 사람이 되어버린...)