프로그래머스 1단계 문제인 '두 개 뽑아서 더하기' 문제를 풀어보았다.
https://programmers.co.kr/learn/courses/30/lessons/68644
정수 배열 numbers가 주어집니다.
numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.
문제에 대한 설명을 들었을 때, 파이썬에 조합 라이브러리가 있다는 것을 떠올리고 그걸 활용하여 풀었다.
# 라이브러리를 사용하고 푸는 방법(Python)
from itertools import combinations # 조합 라이브러리
def solution(numbers):
answer = []
# numbers 리스트에서 두개를 뽑기(조합)
for i in combinations(numbers, 2):
answer.append(sum(i)) # 뽑은 걸 더해서 answer에 넣기
# 중복제거(set) 후 오름차순(sorted) 정렬
answer = sorted(list(set(answer)))
return answer
numbers 리스트에서 combinations함수로 순서에 상관없는 수 두 개를 뽑고, sum(i)로 이 둘을 더해서 answer라는 리스트에 넣는다.
그리고 set()으로 중복을 제거한 후, set({})자료형에서 list([])으로 만들어 준다.
마지막으로 sorted()로 오름차순 정렬을 하여 answer에 저장하여 리턴한다.
# 라이브러리를 사용하지 않고 푸는 방법(Python)
def solution(numbers):
answer = []
# numbers의 길이만큼 for문을 돌면서
for i in range(len(numbers)):
# numbers[i] 다음의 수부터 하나씩 뽑아서(numbers[j])
# 둘이 더하는데, for문으로
for j in range(i+1, len(numbers)):
# numbers[i] 뒤에 있는 모든 값들을
# 중복 없이 뽑아 더할 수 있다. = 조합의 원리
answer.append(numbers[i] + numbers[j])
return sorted(list(set(answer)))
조합이 하는 일을 이중 for문으로 똑같이 구현한 코드이다. 다른 분의 풀이에서 가져왔다.
예를 들어 numbers = [2,1,3,4,1]
라고 하면 i=0일때 j는 i+1인 1부터 2, 3, 4까지 돌고 i=1일 때 j는 i+1인 2부터 4까지 돌고, i=3일 때 j는 i+1인 4와 같이 엮인다.
즉, 이 이중for문을 거치면 아래와 같이 뽑히게 되고 이는 파이썬의 combinations 라이브러리가 하는 일과 같아진다.
(예) 이렇게 뽑는 것!
(2, 1), (2, 3), (2, 4), (2, 1),
(1, 3), (1, 4), (1, 1),
(3, 4), (3, 1),
(4, 1)
스터디는 파이썬이 아닌 자바스크립트로 진행하고 있기 때문에, 자바스크립트로 문제를 해결하는 것에 익숙해지기 위해 python코드를 js로 바꿔보았다.
// 라이브러리를 사용하지 않고 푸는 방법을 자바스크립트로 변환해보았다!(JS)
function solution(numbers) {
let answer = [];
for (let i=0;i<numbers.length;i++) {
for (let j=(i+1); j<numbers.length;j++) {
answer.push(numbers[i] + numbers[j]);
}
}
answer = new Set(answer);
answer = Array.from(answer);
answer.sort((a, b) => a - b); // 오름차순으로 정렬을 의미
return answer;
}
파이썬 코드를 한 줄 한 줄 자바스크립트로 변환한 코드라서 간결하거나 보기 좋은 코드는 아닌 것 같다. 자바스크립트를 공부해나가며 나중에 수정해볼 생각이다.
💡 참고 💡
<let과 var>
자바스크립트 코드에서 var를 쓰지 말고 let을 쓰라는 조언을 받았다.
var는 중복 선언이 가능하고, let은 불가능하다. 하지만 둘 다 재할당은 가능하다. 이에 비해 const는 재할당, 중복 선언 둘 다 불가능하다.
https://heinafantasy.com/153
이런 이론적인 것 말고도, 실제로 let 대신 var를 사용했을 시 여러 문제들이 생긴다고 한다. https://stackoverflow.com/a/11444416 이곳을 참고해보자!