문제 링크: 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 변환이 매번 이루어지기 때문에 효율이 그만큼 증가되는지는 잘 모르겠다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Programmers][Python] 서버 증설 횟수 (0) | 2025.03.22 |
---|---|
[Programmers][Python] 징검다리 건너기 (0) | 2024.06.17 |
[Programmers][Python] 세로 읽기 (0) | 2023.05.04 |
[Programmers][Python] 문자열 돌리기 (0) | 2023.05.02 |
[Programmers][Python] 멀쩡한 사각형 (0) | 2023.05.01 |