일을 하면서 항상 느껴왔던 알고리즘의 부족함을 덜어보고자 알고리즘 공부를 시작하려한다.
프로그래멋, 백준, 프로젝트 오일러 등등 많은 알고리즘 사이트의 문제를 쉬운 것 부터 매일 하나씩 꾸준히 풀어보고자 한다. 파이썬도 배울겸...
그 처음으로 프로그래머스에 있는 문제를 풀어보았다.
프로그래머스
문제
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
제한 사항
numbers의 길이는 2 이상 100 이하입니다.
numbers의 모든 수는 0 이상 100 이하입니다.
입출력 예
numbers = [2, 1, 3, 4, 1]
return [2, 3, 4, 5, 6, 7]
numbers = [5, 0, 2, 7]
return [2, 5, 7, 9, 12]
첫 번째 코드
def solution(numbers):
numbers.sort()
answer = []
for _ in range(len(numbers)):
number = numbers.pop(0)
for j in numbers:
num = number + j
if (answer.count(num) > 0 ):
continue
answer.append(num)
return answer
print(solution([2, 1, 3, 4, 1]))
print(solution([5, 0, 2, 7]))
두 번째 코드
첫 번째 코드를 풀고 난 후 다른 이의 풀이를 보니 많이 부족해 보여 다시 짜 보았다.
def solution(numbers):
answer = []
for i in range(len(numbers)):
for j in numbers[i+1:]:
answer.append(numbers[i] + j)
return sorted(list(set(answer)))
print(solution([5,0,2,7]))
print(solution([2, 1, 3, 4, 1]))
여기서 제일 중요한 부분은 set 함수인듯싶다.
중복을 자기가 알아서 제거해 준다.
조금 다른 생각을 해 보면 처음 numbers를 받을 때 바로 sort() 함수로 정렬을 한다면 마지막에 sorted 를 하는 것 보다 아주 조금이나마 시간을 단축을 하지 않을까? 생각해 봤다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수 (0) | 2021.01.25 |
---|---|
세자리 수를 곱해 만들 수 있는 가장 큰 대칭수 (0) | 2021.01.24 |
가장 큰 소인수 구하기 (0) | 2021.01.23 |
피보나치 수열에서 4백만 이하이면서 짝수인 항의 합 (0) | 2021.01.22 |
1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면? (0) | 2021.01.21 |