코딩 테스트 연습/[프로그래머스] Python

[LV.3] 월간 코드 챌린지 시즌1 > 두 개 뽑아서 더하기

duswjd_data 2025. 7. 10. 10:09

문제

https://school.programmers.co.kr/learn/courses/30/lessons/68644

 

프로그래머스

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

programmers.co.kr


문제 설명

  • 정수 배열 numbers가 주어질 때,
    numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 반환
  • 제한사항)
    numbers의 길이는 2 이상 100 이하
    numbers의 모든 수는 0 이상 100 이하

정답 코드 (개선 필요)

def solution(numbers):

    n = len(numbers)
    answer = []

    for i in range(n-1):
        for j in range(i+1, n):
            plus = numbers[i] + numbers[j]
            if plus not in answer:
                answer.append(plus)
            
    return sorted(answer)

코드 설명

1. 이중 반복문으로 서로 다른 두 수 조합하기

for i in range(n - 1):
    for j in range(i + 1, n):
  • 서로 다른 인덱스를 뽑기 위해 i는 0부터 시작, j는 i보다 하나 큰 값부터 시작 (중복 없는 조합 가능)

2. 중복되지 않으면 리스트에 추가

if plus not in answer:
    answer.append(plus)
  • 리스트 answer에 이미 같은 합이 들어 있는지 확인 → 없으면 추가
  • 리스트에서 중복 체크할 때 in을 쓰면 성능 문제 발생 (개선점)

3. 오름차순 정렬해서 반환

return sorted(answer)

개선된 코드 (set() 사용)

def solution(numbers):
    answer = set()

    for i in range(len(numbers) - 1):
        for j in range(i + 1, len(numbers)):
            answer.add(numbers[i] + numbers[j])

    return sorted(answer)

코드 설명

1. set()

answer = set()

 

  • 중복 없이 값을 저장할 수 있도록 집합(set)을 생성 (같은 값이 들어오면 자동으로 하나만 유지)

2. add()

 

3. sorted()

  • 집합(set), 딕셔너리(dict), 문자열(str), 튜플(tuple) 등 여러 종류의 반복 가능한 객체(iterable)를 받아서,
    정렬된 리스트(list)로 반환
  • set은 순서를 유지하지 않기 때문에, 정렬하려면 꼭 sorted()가 필요

한 줄 코드

def solution(numbers):
    return sorted({numbers[i] + numbers[j] for i in range(len(numbers)) for j in range(i + 1, len(numbers))})