프로그래머스 코딩테스트연습 레벨 0
배열 만들기2
https://school.programmers.co.kr/learn/courses/30/lessons/181921
나의 풀이
function solution(l, r) {
var answer = [];
for(let i = l; i <= r; i++){
if(i % 5 !== 0) continue
let char = String(i)
if(![...char].every(e => e === '0' || e === '5')) continue
answer.push(i)
}
return answer.length ? answer : [-1];
}
- l부터 r까지의 숫자를 for문으로 돌린다.
- 5나 0으로 이루어진 숫자만 남겨야하기 때문에 첫 번째로 필터를 하기 위하여 5로 나누어서 나머지 값이 0이 아닌 것은 제외하기 위하여 ‘continue’를 사용한다.
- 5로 나누어지는 값은 문자열로 변경하기 위하여 String()를 사용한다.
- 문자열로 된 숫자를 각각 자리 수 별로 나누기 위하여 spread 연산자를 사용한다.
- 나누어진 자리에 모두 0 또는 5가 있는지 확인하기 위하여 조건문을 걸어주고, 없다면 continue를 사용하여 제외시킨다. 그리고 그 나머지를 answer에 push한다.
- answer의 길이가 없는 것은 0과 5로 이루어진 수가 없다는 것이므로 -1을 리턴해주도록 삼항연산자를 사용한다.
다른 사람의 풀이
function solution(l, r) {
const result = Array.from({length:r-l+1}, (_,i)=>i+l).filter(n=>!/[^05]/.test(n));
return result.length ? result : [-1];
}
- 다른 사람의 풀이 중 아주 간결한 코드가 있어서 가져와보았다.
- Array.from() 부분이 도저히 무슨 의미인지 해석이 되지 않았는데, mdn을 통해서 이해가 가능했다.
- mdn에 의하면 Array.from은 Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step)) 와 같은 형식으로 길이를 지정할 수 있고, 배열의 각 요소도 화살표 함수로 시작 요소에 i 값을 얼만큼씩 추가할 것인지 지정할 수 있다.
- 즉, 위의 풀이는 from 메소드로 r-l의 배열의 길이이면서, 동시에 첫번째 요소 l에 i 만큼씩 증가시킨 값을 추가한 배열을 생성한다.
- .test() : .test() 메서드는 정규 표현식 객체의 메서드로 호출되며, 인자로 비교할 문자열을 받는다. 해당 문자열이 정규 표현식과 일치하는 부분을 포함하면 true를 반환하고, 일치하는 부분이 없으면 false를 반환한다.
continue와 break 문의 차이
continue | 조건문과 함께 적용했을 때 조건문에 맞지 않은 요소는 제외하고 이후의 계산은 이어나간다. |
break | 조건문과 함께 적용했을 때 조건문에 맞지 않은 요소와 그 뒤의 계산도 모두 멈춰버린다. |
'JS > 알고리즘(코테)' 카테고리의 다른 글
프로그래머스 코딩테스트 LV.0 조건 문자열, 코드 처리하기 (0) | 2023.05.31 |
---|---|
프로그래머스 LV.1 - 문자열 내 마음대로 정렬하기 (0) | 2023.05.26 |
프로그래머스 LV.0 - 진료순서 정하기, 가까운 수 (0) | 2023.05.26 |
프로그래머스 LV.0 - 수 조작하기 2 (0) | 2023.05.23 |
최대공약수와 최소공배수(유클리드 호제법) (0) | 2023.05.20 |