문제 24 - 두 개 뽑아서 더하기 (Python)

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

서로 다른 인덱스의 두 수를 뽑아 만들 수 있는 모든 합을 구한 뒤, 중복을 제거하고 오름차순으로 정렬하는 문제입니다. 핵심은 combinations, set, sorted를 순서대로 연결하는 것입니다.


1.  나의 풀이

from itertools import combinations


def get_pair_sums(numbers):
    return set(map(sum, combinations(numbers, 2)))


def solution(numbers):
    pair_sums = get_pair_sums(numbers)
    return sorted(pair_sums)
 

combinations(numbers, 2)는 서로 다른 인덱스의 원소 2개를 조합으로 뽑습니다.

 
combinations(numbers, 2)
 

각 조합은 (a, b) 형태의 튜플입니다. 여기에 sum을 적용하면 두 수의 합을 바로 만들 수 있습니다.

 
map(sum, combinations(numbers, 2))
 

합이 중복될 수 있으므로 set으로 중복을 제거합니다.

 
set(map(sum, combinations(numbers, 2)))
 

마지막으로 문제에서 오름차순 배열을 요구하므로 sorted를 사용합니다.

 
return sorted(pair_sums)
 

2.  오늘 배운 점 및 복기 노트

조합을 사용해야 하는 이유

이 문제는 두 수를 뽑는 순서가 중요하지 않습니다. 예를 들어 2 + 3과 3 + 2는 같은 결과입니다. 따라서 순서를 고려하는 permutations가 아니라, 순서를 고려하지 않는 combinations를 사용하는 것이 적절합니다.

중복 제거 후 정렬이 필요함

set은 중복 제거에는 좋지만, 순서를 보장하는 정렬 자료구조는 아닙니다. 따라서 set으로 중복을 제거한 뒤 반드시 sorted를 사용해야 문제 조건인 오름차순 배열을 만족할 수 있습니다.

정렬의 핵심

이 문제에서 정렬은 계산 과정의 핵심이라기보다는, 최종 출력 형식을 맞추는 핵심입니다. 가능한 합을 모두 만든 뒤, 중복을 제거하고, 마지막에 sorted로 오름차순 결과를 확정합니다.

한 줄 풀이의 구조

내 풀이를 한 줄로 줄이면 다음과 같습니다.

 
def solution(numbers):
    return sorted(set(map(sum, combinations(numbers, 2))))
 

이 코드는 다음 순서로 읽으면 됩니다.

두 개씩 뽑기 → 각각 더하기 → 중복 제거 → 오름차순 정렬
 

3.  프로그래머스 코딩 테스트 문제 풀이 전략 교재에서 배울만한 점

combinations를 이용한 경우의 수 생성

직접 이중 반복문을 작성하지 않아도 itertools.combinations를 사용하면 두 개를 뽑는 모든 경우를 간결하게 만들 수 있습니다.

combinations(numbers, 2)
 

map(sum, ...) 패턴

조합으로 만들어진 (a, b) 튜플에 대해 sum을 적용하면 반복문 없이 각 쌍의 합을 만들 수 있습니다.

map(sum, combinations(numbers, 2))
 

set과 sorted의 연결

중복 제거가 필요하면 set을 사용하고, 결과가 정렬되어야 하면 마지막에 sorted를 사용합니다. 이 문제는 이 흐름이 그대로 적용됩니다.

sorted(set(...))