알고리즘/Programmers

[Programmers] 두 개 뽑아서 더하기 (월간 코드 챌린지 시즌1 - Level1, Python3)

 

 

코딩테스트 연습 - 두 개 뽑아서 더하기

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

programmers.co.kr

 

문제 설명

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

 

 

제한 사항

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

 

 

입출력 예

numbers result
[2,1,3,4,1] [2,3,4,5,6,7]
[5,0,2,7] [2,5,7,9,12]

 

 

힌트

더보기

조합론 문제이다. 

서로 다른 두 개의 수를 뽑는 것이기 때문에 이중 반복문으로 풀 수 있다.

또한 Python3에는 itertools모듈에 순열과 조합 관련 함수가 있기 때문에 이를 활용해서 풀이해도 좋다.

 

 

풀이

더보기

실제 코드 챌린지 문제로 나왔을 때 1~3분 이내로 풀이가 가능한 문제였다.

 

여러 개의 수를 뽑는 조합이 아닌 2개의 수를 뽑은 조합이기 때문에 이중 반복문으로도 충분히 풀이가 가능했다.

만약 여러개의 조합을 선택하는 경우에 어떻게 해야 할까 궁금하다면 재귀 함수와 Next Permutaion 함수에 대해 알아보도록 하자. (itertools 모듈을 사용해도 좋다.)

 

2개의 수를 뽑아 더해서 만들 수 있는 수가 중복될 수 있다.

중복을 제거해주기 위해 Python의 Set 구조를 사용하면 된다.

 

 

- 이중 반복문을 사용한 풀이 -

def solution(numbers):
    answer = set()
    length = len(numbers)
    
    for i in range(length):
        for j in range(i + 1, length):
            total = numbers[i] + numbers[j]
            
            answer.add(total)
    
    answer = sorted(answer)
    
    return answer

 

- itertools 모듈을 사용한 풀이 -

from itertools import combinations

def solution(numbers):
    answer = set()
    
    for case in combinations(numbers, 2):
        total = sum(case)
        
        answer.add(total)
    
    answer = sorted(answer)
    
    return answer