얼음녹차의 블로그
article thumbnail

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181921

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

처음 작성한 코드

바이너리 변환을 이용하였다.

  • 0과 5로 이루어진 수만 존재하기 때문에 5를 1로 치환하면 이진수와 같게 된다.
  • 최댓값인 r의 자릿수를 이용해, 이진수의 범위를 r의 자릿수만큼의 2의 지수 범위로 정할 수 있다.
    • ex) 555 -> 111 -> 7, (3자리 수 이므로 '(2 ** 3) - 1 = 7'이 된다. 다음으로 range 함수에서는 미만의 수까지만 세므로,  -1을 할 필요 없이 2 ** 3 값만 넣어주면 된다.
  • 이진수를 생성하면서, 각 자리를 0과 5로 변환하여 숫자 문자열을 만든다.
  • 생성된 숫자들 중에서 주어진 범위 [l, r]에 속하는 숫자만 모아 반환해 준다.
def solution(l, r):
    n_lst = []
    n_binary = 2 ** len(str(r))
    
    # r을 바이너리 값으로 변환 (5 -> 1, 0 -> 0)
    for i in range(1, n_binary):
        # 바이너리 값을 5로 이루어진 정수로 치환
        case_5 = int(bin(i)[2:]) * 5
        if case_5 >= l and case_5 <= r:
            n_lst.append(case_5)
    return n_lst or [-1]

# 테스트 예시
print(solution(5, 555))  # [5, 50, 55, 500, 505, 550, 555]
print(solution(10, 20))  # [-1]

만약 코드를 개선한다면 l값과 r값도 이진수로 변환하여 if문을 제거하고 for문의 범위를 줄일 수 있다.

 

사담

숫자 자체를 생성하고 찾는 횟수는 1/5로 줄었지만, str -> int 변환이 매번 이루어지기 때문에 효율이 그만큼 증가되는지는 잘 모르겠다.

 

profile

얼음녹차의 블로그

@PERIR

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!