두 개 뽑아서 더하기

신연우·2021년 1월 30일
0

알고리즘

목록 보기
22/58

프로그래머스 - 두 개 뽑아서 더하기

문제 설명

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

제한 사항

  • numbers의 길이는 2 이상 100 이하입니다.
    • numbers의 모든 수는 0 이상 100 이하입니다.

입출력 예

numbersresult
[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에 담는다.

이후, 마지막에 해당 요소들 중 중복된 값을 제거한 후 오름차순으로 정렬해 반환한다.

프로그래머스의 테스트 결과를 비교해보니, 시간 효율성면에서 내가 작성한 코드보다는 효율이 떨어진다.

profile
남들과 함께하기 위해서는 혼자 나아갈 수 있는 힘이 있어야 한다.

0개의 댓글