코딩 테스트/프로그래머스

[Python] 프로그래머스 배열 만들기 2

위시리 2024. 9. 20. 14:41

 

문제 분석

  • 정수 l과 r을 입력 받고 
  • l부터 r까지 반복문 돌면서 
  • 숫자 0과 5로만 이루어진 수를 만나면
  • 그 수들을 오름차순으로 저장한 배열 answer.append
  • 만약 그런 정수가 없다면 return -1 - 예외 처리

 

코드 설계

  • 어떻게 0과 5로만 이루어진 수를 판단할 것인가
  1. l과 r의 자리를 파악하여 string으로 변환하여 1의 자릿수, 10의 자릿수, 100의 자릿수 .. 늘려가면서 파악할 것인가
  2. 반복문으로 문자열을 하나씩 빼서 비교
str = "hello world"

for i in str :
    print(i)
  • 와 같이 하면 반복문으로 문자열의 문자를 한 문자씩 비교할 수 있다.
  • 해당 숫자를 문자열 취급하여 한 문자씩 빼서 5나 0이 아닌 다른 문자가 있으면 contiue
  • 아니면 answer.append를 해주고
  • 마지막에 answer 배열의 길이가 0이라면 아무것도 들어있지 않은 것이므로 return -1

 

정답 코드

1차

def solution(l, r):

    for i in range(l, r+1) :
        i = str(i) # str 형변환
        l_len = l%10
        r_len = r%10

    answer = []

    return answer

구현하다가 영 아닌거 같다..

 

2차 - 실패

def solution(l, r):
    answer = []

    for i in range(l, r+1) :
        for s in str(i):
            if (s != '5') and (s != '0'):
                continue
            else :
                answer.append(i)

    if not answer :
        return -1

    return answer

print(solution(5,555))

이렇게 하면 예를 들어  '10'인 경우 1에서는 continue를 하지만 '0'에서는 append되어 10이 배열에 포함되어 버림

continue 할 때 그 숫자 i 자체를 넘겨버려야 함

이러한 문제를 해결하기 위해 어느 블로그에서는 check를 설정

 

3차 - 실패

def solution(l, r):
    answer = []

    for i in range(l, r+1) :
        check = True
        for s in str(i):
            if (s != '5') and (s != '0'):
                check = False
                break # 반복문 빠져나오기

        if check :
            answer.append(i)

    if not answer :
        return -1

    return answer

 

4차

def solution(l, r):
    answer = []

    for i in range(l, r+1) :
        check = True
        for s in str(i):
            if (s != '5') and (s != '0'):
                check = False
                break # 반복문 빠져나오기

        if check :
            answer.append(i)

    if not answer :
        return [-1]

    return answer

3차와의 다른 점은 return -1이 아니라 [-1]을 해줬다는 점

" 만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다. "

질문을 잘 읽자..

 

다른 풀이

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 교집합을 이용하여 풀이한 경우도 있다.

 

Set 

  • 고유한 요소의 집합을 나타내는데 사용
  • {} 또는 set() 함수를 통해 생성
  • 순서 없음(인덱싱, 슬라이싱 불가능)
  • 가변
  • 해시 가능한 요소만 포함(예를 들어 리스트는 set에 포함될 수없음)