문제
https://school.programmers.co.kr/learn/courses/30/lessons/68644
풀이
해당 문제를 한 문장으로 줄여 보자면 다음과 같고, 아래와 같이 문제 풀이를 진행할 수 있다.
" 서로 다른 인덱스인 두 개의 값을 더해서 만들어진 값을 오름차순으로 정렬하기 "
이렇게 간단하게 문제를 풀이할 수 있지만 조금 수학적으로 문제를 풀이해 보면 다음과 같다.
Q ) 서로 다른 인덱스인 두 개의 값을 뽑는다.
해당 문제을 읽고 나면 먼저 떠올라야 하는 것이 순열과 조합이다. 서로 다른 n개 중에 r개를 골라 나열하는데 순서가 중요하면 순열, 순서가 중요하지 않으면 조합인데 만약 ['A', 'B', 'C']라는 리스트에서 2개를 뽑아 순열과 조합으로 나타낸다면 다음과 같이 정리가 가능하다.
순열 결과 : [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
조합 결과 : [('A', 'B'), ('A', 'C'), ('B', 'C')]
이 중에서 우리가 필요한 건 서로 다른 인덱스인 두 개의 값이 필요한 것이니 조합을 이용하여 문제를 해결해야겠다고 생각했다.
해당 부분을 고려하면서 코드를 작성하면 다음과 같이 작성이 가능하다.
from itertools import combinations as cb
def solution(numbers):
# [(2, 1), (2, 3), (2, 4), (2, 1), (1, 3), (1, 4), (1, 1), (3, 4), (3, 1), (4, 1)]
combinations_list = list(cb(numbers, 2))
# 배열 돌아가면서 합친 결과를 새로운 배열로 지정 [3, 5, 6, 3, 4, 5, 2, 7, 4, 5]
combinations_list = [sum(i) for i in combinations_list]
# 중복 제거하기 (3, 5, 6, 2, 7, 4)
combinations_list = set(combinations_list)
# 정렬 하기 [2, 3, 4, 5, 6, 7]
combinations_list = sorted(combinations_list)
return combinations_list
만약 Python 본연의 기능 없이 순수 코드(C처럼) 작성하여 정리하고 싶다면 다음과 같이 정리가 가능하다.
def solution(numbers):
answer = []
"""
배열 2개를 돌면서 서로 다른 인덱스의 합을 Answer에 저장함, 저장 할때 중복되는 요소가
있으면 안되니까 numbers[i] + numbers[j] not in answer 로 필터링 함.
"""
for i in range(len(numbers)):
for j in range(len(numbers)):
if i == j:
break;
elif numbers[i] + numbers[j] not in answer:
answer.append(numbers[i] + numbers[j])
return sorted(answer)
내가 제출한 답은 다음과 같다.
from itertools import combinations as cb
def solution(numbers):
return sorted(set(map(sum, cb(numbers, 2))))
'Algorithm > Programmers' 카테고리의 다른 글
프로그래머스 LV1 옹알이2 (0) | 2023.05.05 |
---|---|
프로그래머스 LV1 키패드 누르기 (0) | 2023.05.05 |
프로그래머스 LV1 체육복 (0) | 2023.05.05 |
프로그래머스 LV1 덧칠하기 (0) | 2023.04.28 |
프로그래머스 LV1 추억점수 (0) | 2023.04.27 |