프로그래머스 공부/Python

[Level 1 / Python] 두 개 뽑아서 더하기(월간 코드 챌린지 시즌1)

#자유의날개 2020. 11. 8. 00:50
반응형

문제 설명

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

  • numbers의 길이는 2 이상 100 이하입니다.

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

출처 : programmers.co.kr/learn/courses/30/lessons/68644

풀이 방법

아래 그림과 같이 numbers의 원소 중에 한 개를 먼저 선택하고 이후의 요소들과 각각 덧셈을 한 후 리스트의 append()를 사용하여 answer에 넣는 일련의 과정을 반복하는 방법으로 풀었다. 중복 값을 제거하기 위해 set()을 사용했고, 오름차순 정렬을 위해 sorted()를 사용했다.

위의 방법으로 풀고 나니 앞에서부터 리스트의 pop()을 사용해도 될 것 같은 생각이 들어서 아래 그림처럼 pop()을 사용해 값을 하나씩 빼내면서, np.array()를 사용해 타입을 numpy.ndarray로 변환하고 각 요소에 덧셈을 하도록 했다. 위의 방법과 달리 연산 후 결과가 numpy.ndarray로 나오기 때문에 리스트로 변환 후 extend()를 사용해 answer를 구했다.

또한 numpy.ndarray의 각 요소의 변수 타입은 numpy.int64이기 때문에 내부 요소를 int로 변환할 수 있도록 리스트 컴프리헨션을 사용해서 변환한다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 리스트를 이용한 풀이 방법
def solution(numbers):
    answer = []
    for i in range(len(numbers)):
        for j in range(i+1len(numbers)):
            answer.append(numbers[i] + numbers[j])
    return sorted(list(set(answer)))
 
 
# numpy의 배열을 이용한 풀이 방법
import numpy as np
 
def solution(numbers):
    answer = []
    for i in range(len(numbers)):
        answer.extend(list(np.array(numbers.pop(0)) + np.array(numbers)))
    return sorted(list(set([int(x) for x in answer])))
cs

아래 그림은 두 가지 방법에 대해 프로그래머스에서 실행한 결과인데 리스트를 이용한 풀이 방법이 더 빠르다는 것을 알 수 있었다. 연산 속도에 영향을 주는 원인이 무엇인지 알아볼 필요가 있는 것 같다.

반응형