정수 배열 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] |
from itertools import combinations
def solution(numbers):
answer = map(sum, combinations(numbers, 2))
answer = set(answer)
return sorted(answer)
문제를 해석하면 결국 배열 내 있는 요소 중 임의로 2개를 골라서 그 둘의 합을 저장한 list를 반환하라는 뜻이 된다.
answer = map(sum, combinations(numbers, 2))
list 내에 있는 요소 2개를 임의로 고르는 것이고, 순서가 중요하지 않으므로 조합이란 것을 알 수 있다. 조합으로 구해진 2개의 값은 서로 더해야 하므로 sum과 맵핑한다.
answer = set(answer)
합의 결과가 같은 경우가 있을 수 있다. 예를 들어, [5, 0, 2, 7]
에서는 5 + 2와 0 + 7은 합이 7로 같은 결과를 내놓는다. 하지만, 입출력 예를 보면, 7은 한 번만 나온다. 그러므로 set
을 통해 중복 요소를 제거한다.
return sorted(answer)
문제에서 오름차순으로 된 배열을 반환하라 하였으므로 sorted
함수를 통해 오름차순 정렬하여 반환한다.
def solution(numbers):
answer = []
for i in range(len(numbers) - 1):
for j in range(i+1, len(numbers)):
answer.append(numbers[i] + numbers[j])
return sorted(set(answer))
조합을 앞에서부터 순차적으로 하는 방식을 구현한 로직이다. 맨 앞을 기준으로 잡고, 이후 나오는 모든 배열 요소와 더해서 그 값을 answer에 담는다.
이후, 마지막에 해당 요소들 중 중복된 값을 제거한 후 오름차순으로 정렬해 반환한다.
프로그래머스의 테스트 결과를 비교해보니, 시간 효율성면에서 내가 작성한 코드보다는 효율이 떨어진다.