알쓸코지
article thumbnail

문제

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

 

프로그래머스

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

programmers.co.kr

문제 설명

정수 `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'}

 

Solve 1 / Solve 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
profile

알쓸코지

@chocoji

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