두 개 뽑아서 더하기
in Algorithm
프로그래머스 ‘두 개 뽑아서 더하기’ 문제.
정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return
문제를 풀 떄 생각해보고 해결해야하는 지점들이 있다.
서로다른 인덱스
=> 2중for문 써야겠군
중복허용 안함
=> set이나 if문 써야겠군
배열에 담는다
=> filter / map / push로 담아야겠다
오름차순
=> sort 써야겠군
나의 해결방안
case1
function solution(numbers) {
const arr = [];
let answer = [];
for(let i=0; i<numbers.length; i++){
for(let k =0; k<numbers.length; k++){
if(i !== k){ //앞뒤로 되었을때 곂치는 경우가 있을수있으므로 i인덱스와 k인덱스가 겹치지 않을때
arr.push(numbers[i] + numbers[k])
}
}
}
arr.sort(function(a, b) {
return a - b; //오름차순 sort. 안그러면 [1,12,2,3] 이런식으로 정렬됨
});
const set = new Set(arr); //Set객체사용 => 중복값 제거
answer = [...set]; //중복값이 제거된 set객체(=arr)를 배열화 해주기 위해 스프레드연산자+[] 로 배열화시켜줌
return answer;
}
2중 for문으로 돌린다음에 ‘i번째와 k번째가 일치하지 않을때만’ 이라는 조건문을 걸어서 push 해줬다
그리고 추출된 arr를 오름차순으로 sort해줬고,
sort까지 완료된 arr를 set객체로 중복값을 삭제해주었다.
CASE 2
let answer = [];
for(let i =0 ; i<numbers.length; i++){
for(let j = i+1; j<numbers.length; j++){
const sum = numbers[i] + numbers[j];
if(!answer.includes(sum)){
answer.push(sum);
}
}
}
return answer.sort((a,b) => a-b);
나랑 다른 지점은 ` for(let j = i+1; j<numbers.length; j++){` 이 지점이었다.
2중for문에서 안에 들어가는 for문의 시작점은 i+1로 i와 겹치지 않게 만들어줬다는것.
나는 if(i !== k){
이렇게 조건을 걸어줬는데 저렇게 쓸 수도 있구나, 라고 생각이 들었음
또, 중복을 제거하는 방법이 메서드를 사용하지 않고
if(!answer.includes(sum)){
이렇게 for문 안에서 배열과 includes
함수를 이용해서 중복값을 제거해줄수도 있구나, 생각함.
마지막에 sort는 뭐 똑같지.
CASE 3
let answer = new Set([]);
for(let i =0 ; i<numbers.length; i++){
for(let j = i+1; j<numbers.length; j++){
const sum = numbers[i] + numbers[j];
answer.add(sum)
}
}
// return answer.sort((a,b) => a-b); //sort는 배열에만 사용할 수 있는데 answer는 배열이 아니라서 에러남
return [...answer].sort((a,b) => a-b); //Set객체를 배열로 만들어주로 리턴함
Set객체를 이용한 방법. 처음부터 끝까지 Set객체 속성을 이용해서 풀이.
answer.add(sum)
는 Set객체에서 값을 넣는 속성중의 하나로 add를 쓰면 배열의 push처럼 사용할 수 있다.
Set객체의 속성은 아래에 정리해놓은
Set
const newSet = new Set([1,2,3,3])
ES6에 추가된 문법
배열의 형태를 가지는 객체 데이터
typeof newSet
//objecttypeof []
//objectArray.isArray([])
//trueArray.isArray(newSet)
//false(배열의 형태를 가지는 객체)고유한 값만 저장(자체적으로 중복데이터 허용하지 않음)
newSet
//Set(3){1,2,3}데이터추가
newSet.add(4)
데이터삭제
newSet.delete(2)
//true(데이터가 정상적으로 삭제되었을때 True 리턴)데이터 조회
newSet.has(2)
//데이터가 있으면 true, 없으면 false (includes랑 똑같음)데이터길이 조회
newSet.size
// 3반환(length가 아니고 size)데이터 리셋
newSet.clear()
//Set(0) set객체 자체를 다 비워준다Set객체를 배열로 바꾸는 법
Array.from(newSet)
[...newSet]
: 스프레드연산자를 사용한뒤에[]
로 감싸주면 배열로 만들 수 있다newSet.forEach((e)=>{console.log(e)})
: 객체임에도 불구하고 forEach문을 사용할 수 있다