문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
메모
for...of문은 반복 가능한 객체(Array, Map, Set, String, TypedArray, arguments 객체 등을 포함)에 대해 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성한다.
const arr = ["a", "b", "c"];
for (const x of arr) {
console.log(x);
}
// Expected output: "a"
// Expected output: "b"
// Expected output: "c"
let l = 5;
let r = 555;
const arr = [[5]];
for (let i = 0; arr[i][0] < r; i++) {
const tmp = [];
for (const x of arr[i]) {
tmp.push(x * 10);
tmp.push(x * 10 + 5);
}
arr.push(tmp);
console.log(tmp);
// Expected output:
// arr[1][0] ===> [ 50, 55 ]
// arr[2][0] ===> [ 500, 505, 550, 555 ]
// arr[3][0] ===> [ 5000, 5005, 5050, 5055, 5500, 5505, 5550, 5555 ]
}
flatMap()은 먼저 매핑함수를 사용해 각 엘리먼트에 대해 map 수행 후, 결과를 새로운 배열로 평탄화한다. 이는 깊이 1의 flat이 뒤따르는 map과 동일하지만, flatMap은 아주 유용하며 둘을 하나의 메서드로 병합할 때 조금 더 효율적이다.
const arr = [[5]];
const test1 = arr.map(x => [x * 10, x * 10 + 5]);
console.log(test1);
// Expected output: [ [ 50, 55 ] ]
const test2 = arr.flatMap(x => [x * 10, x * 10 + 5]);
console.log(test2);
// Expected output: [ 50, 55 ]
정답
// 2차원 배열 활용 - for문
function solution(l, r) {
// arr의 초기값으로 [5]를 설정한다
const arr = [[5]];
// 반복은 arr[i][0]이 r보다 작을 때까지 수행된다
for (let i = 0; arr[i][0] < r; i++) {
// 현재 단계에서 생성된 값을 임시로 저장할 배열을 선언한다
const tmp = [];
for (let x of arr[i]) {
// 이전 단계의 값에 10을 곱해 tmp 배열에 추가한다
tmp.push(x * 10);
// 이전 단계의 값에 10을 곱하고 5를 더하여 tmp 배열에 추가한다
tmp.push(x * 10 + 5);
}
// 현재 단계에서 생성된 값을 arr 배열에 추가한다
arr.push(tmp);
}
// arr 배열을 1차원으로 평탄화하고, l 이상 r 이하인 값들로 필터링한다
const answer = arr.flat().filter(x => l <= x && x <= r);
// 필터링된 값이 존재하면 해당 배열을 반환하고, 그렇지 않으면 [-1]을 반환한다
return answer.length ? answer : [-1];
}
// 2차원 배열 활용 - while문
function solution(l, r) {
// arr의 초기값으로 [5]를 설정한다
const arr = [[5]];
let i = 0;
// 반복은 arr[i][0]이 r보다 작을 때까지 수행된다
while (arr[i][0] < r) {
// 현재 단계에서 생성된 값을 임시로 저장할 배열을 선언한다
const tmp = arr[i].flatMap(x => [x * 10, x * 10 + 5]);
// 현재 단계에서 생성된 값을 arr 배열에 추가한다
arr.push(tmp);
i++;
}
// arr 배열을 1차원으로 평탄화하고, l 이상 r 이하인 값들로 필터링한다
const answer = arr.flat().filter(x => l <= x && x <= r);
// 필터링된 값이 존재하면 해당 배열을 반환하고, 그렇지 않으면 [-1]을 반환한다
return answer.length ? answer : [-1];
}
// l ~ r에 해당하는 모든 숫자를 검사
function solution(l, r) {
let answer = [];
for (let i = l; i <= r; i++) {
// 현재 숫자를 문자열로 변환하고, 각 자릿수를 배열로 분할한다
// 그리고 배열의 요소가 "5" 또는 "0"인지 확인한다
if (
i
.toString()
.split("")
.every(x => x == "5" || x == "0")
)
// 모든 자릿수가 "5" 또는 "0"인 경우, 현재 숫자를 정답 배열에 추가한다
answer.push(i);
}
// 정답 배열의 길이에 따라 결과를 반환한다
// 정답 배열이 비어있는 경우 [-1]을 반환하고, 그렇지 않은 경우 정답 배열을 반환한다
return answer.length == 0 ? [-1] : answer;
}