[프로그래머스] 배열 만들기 2

이강혁·2023년 10월 26일
0

프로그래머스

목록 보기
27/79
post-custom-banner

https://school.programmers.co.kr/learn/courses/30/lessons/181921#

문제 설명

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

제한사항

  • 1 ≤ l ≤ r ≤ 1,000,000

입출력 예

l	r	result
5	555	[5, 50, 55, 500, 505, 550, 555]
10	20	[-1]

입출력 예 설명

  • 입출력 예 #1
    5 이상 555 이하의 0과 5로만 이루어진 정수는 작은 수부터 5, 50, 55, 500, 505, 550, 555가 있습니다. 따라서 [5, 50, 55, 500, 505, 550, 555]를 return 합니다.
  • 입출력 예 #2
    10 이상 20 이하이면서 0과 5로만 이루어진 정수는 없습니다. 따라서 [-1]을 return 합니다.

코드

  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;
}
profile
사용자불량
post-custom-banner

0개의 댓글