본문 바로가기
source-code/Algorithm

프로그래머스 _ 두 개 뽑아서 더하기

by mattew4483 2021. 2. 18.
728x90
반응형

프로그래머스 _ 두 개 뽑아서 더하기

programmers.co.kr/learn/courses/30/lessons/68644

 

코딩테스트 연습 - 두 개 뽑아서 더하기

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

programmers.co.kr


가장 먼저 든 생각 → 짧고 쉬워 보인다!

다음으로 든 생각 → numbers[i]와 numbers[i+1]을 더해주면 끝 아닌가?

대충 이런 식으로? 하지만 코드 실행도 전에 문제점이 보인다.

i는 numbers의 길이만큼 for문을 돌텐데, i가 len(numbers) 번째라면?

numbers[i+1]은 존재하지 않는다!!! out of range 에러가 뜰 것이 불 보듯 뻔하다.

 

따라서 이렇게! 

이러면 numbers의 원소가 5개일 때 numbers[4]에서 멈추는디요?

맞다! numbers[3] + numbers[4]까지만 필요하고 numbers[4]+numbers[5]는 필요가 없으니까!(존재하지도 않고)

끄응... 출력된 걸 보니 7과 12가 존재하지 않는다.

이 녀석들은 5+2 , 5+7이 이뤄져야 하는데...?

 

아하! 우리가 적은 코드는 i 번째 숫자와 그다음인 i+1번째 숫자만을 더할 뿐이다!!

두 수를 뽑아 더해서 만들 수 있는 모든 수를 구해야 하므로...

[i]와 [i+1], [i+2], [i+3], .... [len(numbers)] 모두를 더해야만 한다!!!

↑ i번 째 뒤도 1,2,3... len(numbers)만큼 증가하네? → for문을 하나 더 쓰자!

첫 번째 for문을 통해 numbers의 i번째 숫자를 구하고,

두 번째 for문을 통해 i+1번째, i+2번째, ... len(numbers) 번째 숫자를 구해 둘을 더했다!

 

또한 더해서 나올 수 있는 숫자들의 중복을 없애어야 하므로 set()을 써준 모습!

띠용... 또 출력된 값을 보아하니...

이상한 녀석이 껴있다! 바로 0과 14! 이 둘은 각각 0+0, 7+7을 해야 나오는 숫자.

 

아하..! numbers[i] + numbers[j+1]를 해줬으니 i=j+1일 때는 같은 수를 더하는 게 돼버린다!

하지만 우리가 원하는 건 서로 다른 두 숫자를 더해 나올 수 있는 수를 구하는 것.

쨔잔. 따라서 if문을 통해 i와 j+1이 같으면 continue를 시켜줬다!

 

또한 return값은 list형태여야 하니 set(result)를 다시 list에 담아준 모습.

띠요요요요용? 우째 이런 일이...!

테스트 4,5번이 대체 뭐길래...?

 

으악! 첫 10글자를 읽자마자 번뜩 든 생각!

문제를 잘 읽어보면 → 모든 수를 배열에 오름차순으로 담아!

 

오름차순은 sorted()만 써주면 간단!

 

오늘은 4점 획득!


오늘도 다른 사람의 풀이.

으악!

for문을 2개 돌리는 건 비슷하다만... 두 번째 for문의 범위를 저렇게 지정해주면 될 일이었다!

어차피 i번째 수와 i+1~len(numbers) 번째의 수를 더해주는 거니까!!!

728x90
반응형