프로그래머스 level 1 두 개 뽑아서 더하기(itertools - combinations)
16 Jun 2021 | 기초 프로그래머스문제 설명
정수 배열 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)])))
주요 포인트 및 생각해볼 점
내장함수를 이용하면 수학적인 부분을 더 쉽게 해결할 수 있다.