Notice
Recent Posts
Recent Comments
Link
관리 메뉴

윤일무이

[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 두 개 뽑아서 더하기 본문

⚙️ 코딩테스트

[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 두 개 뽑아서 더하기

썸머몽 2023. 4. 19. 00:17
728x90

문제 및 제한사항

 

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

 

**제한사항**

numbers의 길이는 2 이상 100 이하입니다.

numbers의 모든 수는 0 이상 100 이하입니다.

 

풀이 방법

 

우선 배열을 전부 돌면서 만들 수 있는 모든 수를 찾으면서, 같은 인덱스가 아닌 경우만 answer에 push한다.그리고 오름차순으로 정렬한 뒤, 중복값을 제거해준다.

 

이렇게 하니까 for문을 3번 돌아서 시간 복잡도가 O(n^3)이 됐다.효율성을 높이기 위해 Set을 쓰거나 includes를 써서 풀어도 된다고 하는데 전자의 경우는 내가 아직 모른다...

 

function solution(numbers) {
  const answer = new Set();
  for (let i = 0; i < numbers.length - 1; i++) {
    for (let j = i + 1; j < numbers.length; j++) {
      answer.add(numbers[i] + numbers[j]);
    }
  }
  return [...answer].sort((a, b) => a - b);
}

 

Set은 중복을 허용하지 않는 값의 집합이라고 한다. 그래서 마지막 for문처럼 중복 여부를 고려할 필요가 없어진다.서로 다른 인덱스에서 뽑기 위해 i와 j는 1씩 차이가 나게 수정되었다.

 

코드

function solution(numbers) {
  let answer = [];
  let answer2 = [];

  for (let i = 0; i < numbers.length - 1; i++) {
    for (let j = i + 1; j < numbers.length; j++) {
      let ele = numbers[i] + numbers[j];
      answer.push(ele);
    }
  }
  
  answer.sort((a, b) => a - b);
  
  for (let i = 0; i < answer.length; i++) {
    if (answer[i] !== answer[i + 1]) {
      answer2.push(answer[i]);
    }
  }
  
  return answer2;
}
728x90