문제
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] |
Code
Solve1 - 중복 조합 이용
from itertools import product
def solution(l, r):
numbers = [0, 5]
answer = []
for p in product(numbers, repeat=len(str(r))):
num = int(''.join(map(str, p)))
if l <= num and num <= r:
answer.append(num)
return answer if answer else [-1]
- `numbers = [0, 5]`: 0과 5로만 이루어진 리스트를 생성한다.
- `product(numbers, repeat=len(str(r)))`: `product`를 이용하여 길이가 `len(str(r)))`인 중복 순열을 생성한다.
- 입출력 예 #1의 경우 `print(p)`를 했을 때 다음과 같이 출력된다.
(0, 0, 0)
(0, 0, 5)
(0, 5, 0)
(0, 5, 5)
(5, 0, 0)
(5, 0, 5)
(5, 5, 0)
(5, 5, 5)
- `num = int(''.join(map(str, p)))`: 생성된 숫자 조합을 정수로 변환한다.
- `num`이 `l` 이상 `r` 이하인 경우에만 `answer`에 추가한 뒤, `answer`를 반환하되, 빈 리스트라면 `[-1]`를 반환하도록 한다.
Solve2 - set() 이용
def solution(l, r):
answer = [num for num in range(l, r + 1) if set(str(num)) <= {'0', '5'}]
return answer if answer else [-1]
- 주어진 숫자 `num`을 문자열로 변환하고, 이 문자열의 각 문자를 집합으로 만들어서 그 집합이 `{'0', '5'}`와 같거나 작은지를 확인한다.
- 입출력 예 #2의 경우, if문 전에 `num`과 `set(str(num))`를 출력해보면 다음과 같이 출력된다.
10, {'0', '1'}
11, {'1'}
12, {'2', '1'}
13, {'1', '3'}
14, {'4', '1'}
15, {'5', '1'}
16, {'1', '6'}
17, {'7', '1'}
18, {'8', '1'}
19, {'1', '9'}
20, {'0', '2'}
- Solve2가 `l` 이상 `r` 이하의 수를 모두 검사하기 때문에 이러한 결과가 나오는 것 같다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[Lv.0/Python] 수 조작하기 1 (1) | 2023.11.26 |
---|---|
[Python] 홀짝에 따라 다른 값 반환하기 (0) | 2023.11.26 |
[Python] 공배수 (0) | 2023.11.26 |
[Python] n의 배수 (0) | 2023.11.26 |
[Python] 문자열 곱하기 (0) | 2023.11.24 |