https://school.programmers.co.kr/learn/courses/30/lessons/181921#
정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.
l r result
5 555 [5, 50, 55, 500, 505, 550, 555]
10 20 [-1]
function solution(l, r) {
var answer = [];
let t = 1, i=1;
while (t*5<l) {
t = i++;
t = parseInt(t.toString(2))
}
if(t*5>r){
return [-1];
}
while(t*5<=r){
answer.push(t*5);
t = ++i;
t = parseInt(t.toString(2))
}
return answer;
}
10진수를 1씩 더하면서 2진수로 변환하고 변환된 것을 그대로 10진수로 바꾼 뒤에 5를 곱해서 비교하는 방식으로 접근했다.
그런데 테스트 케이스 절반 이상이 틀렸다.
테스트 케이스
500, 6000을 추가하니까 처음에 l 이상의 수를 구하는 과정에서 l이 시작지점일 때 i가 1이 하나 더 해져서
500, 505, 550으로 시작해야하는데
500, 550, 555로 출력되는 경우가 생겼다.
그래서 i을 0부터 시작하니까 다른 케이스들도 틀리기 시작했다.
이때부터는 반은 맞고 반은 틀리는 경우가 발생했다. 첫 while을 도는 경우와 돌지 않는 경우가 나뉘었다.
그래서 t도 0부터 시작하니까 해결됐다.
function solution(l, r) {
var answer = [];
let t = 0, i=0;
while(t*5<l){
i++;
t = i;
t = parseInt(t.toString(2))
}
if(t*5>r){
return [-1];
}
while(t*5<=r){
answer.push(t*5);
i++;
t = i;
t = parseInt(t.toString(2))
}
return answer;
}