프로그래머스
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(...))
'알고리즘 > 프로그래머스 문제 풀이 전략' 카테고리의 다른 글
| 문제 24 - [카카오 인턴] 수식 최대화 (Python) (0) | 2026.06.06 |
|---|---|
| 문제 23 - 불량 사용자 (Python) (0) | 2026.05.06 |
| 문제 22 - 소수 찾기 (Python) (0) | 2026.05.06 |
| 문제 21 - 카펫 (Python) (0) | 2026.05.02 |
| 문제 20 - 모의고사 (Python) (0) | 2026.05.02 |
