데이터분석 기록일지

문제풀이/프로그래머스

[프로그래머스 Lv.1] 나누어 떨어지는 숫자 배열 (Python)

야하루 2024. 7. 9. 15:44

코딩테스트 연습 - 나누어 떨어지는 숫자 배열 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

문제

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

 

 

제한 사항

arr은 자연수를 담은 배열입니다.
정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
divisor는 자연수입니다.
array는 길이 1 이상인 배열입니다.

 

 

입출력 예
arr divisor return
[5, 9, 7, 10] 5 [5, 10]
[2, 36, 1, 3] 1 [1, 2, 3, 36]
[3, 2, 6] 10 [-1]

 

 

 


풀이

 

아이디어:  모든 요소를 divisor로 나누어서, 나누어 떨어지는 것들만 새로운 리스트에 추가하기
# 1
def solution(arr, divisor):
    list = []
    for i in arr:
        if i%divisor == 0:
            list.append(i)
        list.sort()
    if len(list) == 0:
        return [-1]
    return list

 

-> 빈 리스트를 만들고, arr의 요소를 순회하며, divisor로 나누어지는 값만 빈 리스트에 추가했다.

    그리고 list를 오름차순으로 정렬하고, len(list)가 0일 경우 [-1]을 리턴하도록 조건을 추가한 뒤, list를 리턴했다.

    (내가 사용한 'list' 변수처럼 기존의 함수나 타입 이름을 그대로 쓰는거는 추천하지 않는다. 그렇게 설정하면 종종 오류가 뜨기 때문)

 

 

 

# 2
def solution(arr, divisor):
    answer = [x for x in arr if x%divisor == 0]
    answer.sort()
    if len(answer)==0:
        return [-1]
    return answer

-> 위와 똑같은 흐름을 리스트 컴프리헨션을 이용해서 더 간단하게 작성했다.

 

 

# 3
def solution(arr, divisor):
    result = sorted(list(filter(lambda x: x%divisor == 0, arr)))
    return result or [-1]

-> filter() 함수를 이용한 풀이법. filter 조건으로 내가 원하는 lambda 함수를 지정해 주었다. 이를 리스트로 변환하고 sorted()로 정렬했다.

리스트이기 때문에 sort()함수도 사용 가능하지만 sorted()를 사용한 이유는, sort()는 리스트 메모리의 값 자체를 변경하기 때문에 반환되는 값이 없다. 반면 sorted()는 새로운 이터러블을 만들어서 반환해주기 때문에, 새로운 리스트를 만들어주면서 원래의 리스트는 변하지 않는다.

마지막으로 빈 리스트는 False이기 때문에 or 조건을 사용하여서 빈 리스트일 경우는 [-1] (True)을 반환하도록 만들었다.

 

 

Filter()
이터러블 객체의 요소들을 어떠한 기준으로 필터링한다.
원하는 기준에 맞는 요소들만 뽑아올 수 있다.

사용: filter(함수, 이터러블)