루나의 TIL 기술 블로그

프로그래머스 level 1 두 개 뽑아서 더하기(itertools - combinations)

|

두 개 뽑아서 더하기

문제 설명

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

입출력 예

numbers result
[2,1,3,4,1] [2,3,4,5,6,7]
[5,0,2,7] [2,5,7,9,12]

사고 과정

def solution(numbers):
    for i in numbers:
        for j in numbers:
            numbers.append(i+j)
    return set(numbers)

반복문을 두 겹으로 돌리면 되겠지라고 생각했는데 실행시간이 10초를 넘겨서 처리되지 않았다. 어딘가 잘못 된 것 같은데 이렇게 풀려면 아래처럼 작성했어야 했다.

def solution(numbers):
    answer = []
    for i in range(len(numbers)):
        for j in range(i+1, len(numbers)): 
            #i+1을 쓰면 서로 다른 두 수가 되나?
            if numbers[i]+numbers[j] not in answer:
                answer.append(numbers[i]+numbers[j])
    answer.sort()
    return answer

인터넷에 찾아보니 이런 내장함수가 있었다.

from itertools import combinations
def solution(numbers):
    answer = set()
    for i in list(combinations(numbers,2)):
        answer.add(sum(i))
    return sorted(answer)

파이썬 기본 라이브러리인 itertools의 combinations 라는 내장함수를 사용하여 인자값에 따라 해당 요소로 구할수 있는 모든 조합을 리턴한다.
ex) combinations(numbers, 2)는 numbers 리스트 안에 2개의 요소로 구할 수 있는 모든 조합을 반환한다.

모범 답안

from itertools import combinations
def solution(numbers):
    return sorted(list(set([sum([i,j]) for i,j in combinations(numbers,2)])))

주요 포인트 및 생각해볼 점

내장함수를 이용하면 수학적인 부분을 더 쉽게 해결할 수 있다.