made by ME
#입력: 정수 l, r
#출력: 배열 answer - l~r 사이의 수 중 숫자 0과 5로만 이루어진 모든 정수, 오름차순 배열
"""
* 5를 1, 0을 0 : 이진수
*1. 반복문 범위를 정한다.
*2. 이진수를 0과 5로 바꾸는 방법 -> bin(i) + replace()
*3. l과 r 사이의 값만 걸러내기 및 예외 처리
"""
def solution(l, r):
answer = []
temp = []
for i in range(2**6):
num = bin(i)
temp.append(num[2:])
for i in range(len(temp)):
temp[i] = int(temp[i].replace("1", "5"))
for n in temp:
if n >= l and n <= r:
answer.append(n)
if not answer:
return [-1]
return answer
처음에는 l과 r의 자릿수 대로 전부 0으로 처리한 배열을 만들까 싶었는데..(지금 생각하면 메모리 낭비가 엄청 심한 방법이었던 것 같다..) 도저히 감이 안 잡히길래 gemini에게 조언을 구했다. 정답을 절대 알려주지 말고, 생각의 허점과 어떻게 풀어갈지 힌트를 달라고 했다. 그래서 얻은 힌트는
1) 0과 5로만 이루어진 수들 -> 이진수의 체계와 비슷하다!
=> 0은 0, 5는 1로 바꾼다면..?2) 문제에서 r의 최대값은 1,000,000 이하이며, '0'과 '5'로만 이루어진 가장 큰 수는 555555(5자리)이다. 이를 이진수로 바꾼다면 111111
=> 그렇다면 반복문의 범위는..?3) 이진수를 0과 5로 바꾸는 방법: bin() + replace()
한 시간 넘게 씨름한 것 같다..
다른 사람의 풀이 중에 너무 깔끔한 게 있어서 적고 싶어서 적는다.
def solution(l, r):
answer = []
for num in range(l, r + 1):
if not set(str(num)) - set(['0', '5']):
answer.append(num)
return answer if answer else [-1]
처음부터 반복문의 범위를 l부터 r까지로 한정하면서,
그 사이 수를 set() 함수와 차집합을 이용해 5와 0으로만 이뤄진 걸 뽑아내는 로직을
단 3줄로 압축한 게...진짜 리스펙이다.