[프로그래머스] 두 개 뽑아서 더하기 (Python3)

Song_Song·2021년 4월 4일
0

문제 설명

정수 배열 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]

나의 첫번째 풀이

def solution(numbers):
    answer = []
    length = len(numbers)
    
    for i in range(length - 1):
        for j in range(i+1, length):
            num = numbers[i] + numbers[j]
            answer.append(num)
   
    answer.sort()
    answer = set(answer)
    answer = list(answer)
    
    return answer
  1. 이중 포문으로 값을 i번째부터 i+1 까지 모두 더해서
  2. 정렬
  3. 세트로 변경 후 (세트는 자동으로 중복값 삭제) 다시 리스트로 변경

을 생각했다.
그렇게 풀어본 결과..

테스트 케이스 실패.


첫번째 문제풀이 리팩토링

def solution(numbers):
    answer = set()
    length = len(numbers)
    
    for i in range(length - 1):
        for j in range(i+1, length):
            num = numbers[i] + numbers[j]
            answer.add(num)
   
    
    answer = list(answer)
    answer.sort()

answer를 set로 미리 지정하고 값을 다 더한 이후에 list로 바꾸었다.
(참고로 set에서 append()와 같은 역할을 하는 함수는 add() 이다. 그리고 set에는 sort()를 지원하지 않는다.)

그랬더니 테스트케이스 모두 통과. 첫번째 풀이와 뭐가 다른걸까


나의 두번째 풀이

def solution(numbers):
    answer = []
    length = len(numbers)
    
    for i in range(length - 1):
        for j in range(i+1, length):
            num = numbers[i] + numbers[j]
            if num not in answer:
                answer.append(num)
   
    answer.sort()
    
    return answer

if num not in answer 를 쓰면 알아서 answer 이라는 list 내부를 찾아보는 듯 하다.. 처음에는 for 문을 돌려 aswer 안을 하나하나 일일히 뒤져보려 했는데 그럴 필요가 없었다 ㅎㅎ 파이썬 좋네.

하지만 테스트 7과 8에서 테스트 시간이 너무 오래 걸렸다. 리팩토링 필요.


다른 사람의 풀이

from itertools import combinations
def solution(numbers):
    answer = set()
    for i in list(combinations(numbers,2)):
        answer.add(sum(i))
    return sorted(answer)

itertools 라이브러리의 combinations함수를 써서 풀이.

profile
성장을 위한 정리 블로그

0개의 댓글