1. 문제 파악하기
- 0이상 100이하인 정수가 들어있는 numbers의 길이는 2이상 100이하이다.
→ 그렇게 길지 않은 데이터네요.
- 더할 수 모든 수를 리스트에 담아서 오름차순으로 return 해야한다.
2. 문제 접근하기
이 문제를 읽고 서로 다른 인덱스에 있는 두 개의 수를 더하라는 말을 보고 바로 이중 for문이 떠오릅니다. 이중 for문을 사용하면 시간복잡도는 n^2이라 좋은 성능의 알고리즘은 아니지만 문제 조건에서 numbers의 길이가 2이상 100이하라고 주어진 것을 보니 시간제한이 걸릴만한 길이는 아닐거 같습니다.
3. 주의할 점
얼핏보면 간단한 알고리즘인거 같지만 정답을 맞추기 위해서 몇가지 주의를 놓치면 조금 헤맬수 있습니다.
- return할 리스트에 중복 값이 들어가면 안된다.
→ 입출력의 예를 보면 2+3, 1+4로 5가 여러번 나올 수 있습니다. 하지만 result에 보면 5가 한번밖에 나타나 있지 않죠. 중복 값이 나타난다면 제거를 해야한다는 뜻입니다.
- return하는 리스트는 오름차순으로 정렬해야한다.
→ 쉬운 조건이지만 놓칠 수 있는 조건입니다. 문제를 꼼꼼히 읽어야할 필요가 있습니다.
Python을 능숙하게 사용하신 분들이라면 해당 문제를 쉽고 빠르게 해결하셨을 문제입니다. 하지만 Python을 다룬지 얼마 안되신 분들이나, Python 내장함수를 잘 모르시는 분들이라면 코드가 길어질 수 있습니다. Python의 장점은 이전 글에도 설명을 드렸지만 다른 언어보다 내장함수가 잘 되어있어 Python 내장함수만 알아도 문제를 쉽고 짧은 코드로 해결할 수 있습니다.
4. 정답 코드 및 해석
따라서 정답 코드는 아래와 같다고 할 수 있습니다.
앞에서 설명했다 싶이 2중 for문을 사용했습니다. 앞에 for문은 numbers의 처음부터 시작해야하며 numbers의 끝까지 가면 됩니다. 두번째 for문은 i랑 다른 인덱스에서 시작해야하므로 i+1에서 시작하면 됩니다. 그래서 answer 리스트에 두 인덱스에 해당하는 값을 더합니다.
이렇게 for문을 빠져나오면 answer에는 아까 주의할 점에서 언급한 것과 같이 중복 된 값이 들어있고 정렬되어 있지 않은 상태입니다. Python에는 아주 감사하게도 set()이라는 함수와 list()라는 함수가 있습니다. set()은 우리가 흔히아는 집합입니다. set이 list와 다른 점은 중복된 값을 저장할 수 없으며 순서를 보장하지않는다는 점입니다. 따라서 우리는 중복 값을 제거하기 위해서 set(answer)를 사용합니다. 하지만 이렇게만 하면 정렬할 때 조금 귀찮아집니다. 따라서 중복을 없앤 set(answer)에 list(set(answer))를 사용하여 다시 리스트로 만들어줍니다. 리스트에는 sort()함수를 사용하여 쉽게 오름차순으로 만들 수 있습니다.
이렇게 해서 return을 하면 정답을 얻어 낼 수 있습니다.
5. 다른 풀이방법
이렇게 2중 for문을 사용하지 않고 이 문제를 해결하는 방법은 없을까요? 있습니다. itertools.combinations를 사용해서 문제를 해결할 수 있습니다. itertools.combination은 특정 리스트 원소로 조합을 만들어 냅니다. itertools 라이브러리도 사용법을 안다면 많은 알고리즘 문제를 깔끔하게 해결할 수 있는 경우가 많습니다. 단점은 라이브 코딩도중 해당 라이브러리 이름이 떠오르지않는다면 난감하다는 점이겠죠..;;; 또 저같은 경우는 itertools를 거의 사용하지 않는 편인데요. 그 이유는 아래에서 다시 언급하겠습니다. itertools 라이브러리에는 combinations뿐만 아니라 다른 유용한 함수들도 많습니다. combinations와 다른 함수들을 사용하는 방법은 google에 직접 찾아보시길 바랍니다.
itertools.combinations를 사용하면 아래와 같이 코드를 작성할 수 있으며 해당 코드 결과입니다.
보시면 2중 for문을 사용하진 않았지만 테스트에 소요되는 시간은 더 오래 걸린 것을 확인할 수 있습니다. 왜 이런 현상이 발생하는지는 combinations 함수를 실행할 때 어떤 형식으로 조합을 만들어 내는지를 분석해야겠지만 제 예상으로는 애초에 조합을 생성할 때도 2중 for문을 사용하면서 조합을 만들어 내지않나 싶습니다. 따라서 뭔가 2중 for문을 사용하지 않아서 조금 편안해진 기분은 들지만 걸린 시간을 보니 찜찜한건 남아 있습니다... 저는 오히려 itertools를 사용할 때 이렇게 시간이 더 오래 걸리는 경우가 많아서 해당 라이브러리를 잘 사용하지 않습니다. 실제로 좀 더 난이도 있는 문제에서 사용하다간 시간초과에 걸리는 경우도 종종 있었습니다. 따라서 상황에 맞게 잘 사용하는 방법 밖에 없어보입니다.
6. 마치며
이번 문제는 크게 어려운 문제는 아니었습니다. 프로그래밍을 처음하시는 분들도 다른 문제들이랑 비교했을 때 비교적 쉽다고 생각하셨을 문제입니다. 하지만 Python의 내장함수에 대해서 지식이 없으셨다면 코드가 길어지거나 헷갈리셨을 수도 있었을거 같습니다. Python을 주언어로 사용하실 목적이라면 Python의 내장함수와 주요 라이브러리를 잘 숙지해두시는 것이 중요하겠습니다.
'CS > Algorithm' 카테고리의 다른 글
프로그래머스 level2 메뉴 리뉴얼 (0) | 2021.02.13 |
---|---|
프로그래머스 level2 주식 가격 (0) | 2021.02.12 |
프로그래머스 level1 신규 아이디 추천 (0) | 2021.02.11 |
내가 Python을 사용하는 이유 (0) | 2020.11.23 |
프로그래머스 Level 1 완주하지 못한 선수 찾아내기 (0) | 2020.11.22 |