두 개 뽑아서 더하기




프로그래머스 ‘두 개 뽑아서 더하기’ 문제.

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return






문제를 풀 떄 생각해보고 해결해야하는 지점들이 있다.

  1. 서로다른 인덱스

    => 2중for문 써야겠군

  2. 중복허용 안함

    => set이나 if문 써야겠군

  3. 배열에 담는다

    => filter / map / push로 담아야겠다

  4. 오름차순

    => 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에 추가된 문법

  1. 배열의 형태를 가지는 객체 데이터

    typeof newSet //object

    typeof [] //object

    Array.isArray([]) //true

    Array.isArray(newSet) //false(배열의 형태를 가지는 객체)



  2. 고유한 값만 저장(자체적으로 중복데이터 허용하지 않음)

    newSet //Set(3){1,2,3}



  3. 데이터추가

    newSet.add(4)



  4. 데이터삭제

    newSet.delete(2) //true(데이터가 정상적으로 삭제되었을때 True 리턴)



  5. 데이터 조회

    newSet.has(2) //데이터가 있으면 true, 없으면 false (includes랑 똑같음)



  6. 데이터길이 조회

    newSet.size // 3반환(length가 아니고 size)



  7. 데이터 리셋

    newSet.clear() //Set(0) set객체 자체를 다 비워준다



  8. Set객체를 배열로 바꾸는 법

    Array.from(newSet)

    [...newSet] : 스프레드연산자를 사용한뒤에 []로 감싸주면 배열로 만들 수 있다

    newSet.forEach((e)=>{console.log(e)}) : 객체임에도 불구하고 forEach문을 사용할 수 있다






© 2018. by sora

Powered by sora