저장을 습관화

프로그래머스 LV.0 배열 비교하기 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 배열 비교하기

ctrs 2023. 9. 17. 15:07

프로그래머스 LV.0 배열 비교하기

https://school.programmers.co.kr/learn/courses/30/lessons/181856

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 명

배열 비교하기


2. 문제 설명

이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.

 

- 두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다.

- 배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다.

 

두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.


3. 제한 사항

- 1 ≤ arr1의 길이 ≤ 100

- 1 ≤ arr2의 길이 ≤ 100

- 1 ≤ arr1의 원소 ≤ 100

- 1 ≤ arr2의 원소 ≤ 100

- 문제에서 정의한 배열의 대소관계가 일반적인 프로그래밍 언어에서 정의된 배열의 대소관계와 다를 수 있는 점에 유의해주세요.


4. 예시

arr1 arr2 result
[49, 13] [70, 11, 2] -1
[100, 17, 84, 1] [55, 12, 65, 36] 1
[1, 2, 3, 4, 5] [3, 3, 3, 3, 3] 0


5. 기본 제공 코드

function solution(arr1, arr2) {
    var answer = 0;
    return answer;
}


6. 제출한 내 답

const solution = (arr1, arr2) => {
  if (arr1.length !== arr2.length) {
    return arr1.length > arr2.length ? 1 : -1;
  } 
  else {
    let arr1Sum = arr1.reduce((a, b) => {
      return a + b;
    }, 0);
    let arr2Sum = arr2.reduce((a, b) => {
      return a + b;
    }, 0);
    return arr1Sum > arr2Sum ? 1 : arr1Sum < arr2Sum ? -1 : 0;
  }
};

 

6-2. VSC에 작성한 내용

const solution = (arr1, arr2) => {
  if (arr1.length !== arr2.length) {
    // 배열의 길이가 다르다면
    return arr1.length > arr2.length ? 1 : -1;
  } // 배열의 길이가 같다면
  else {
    let arr1Sum = arr1.reduce((a, b) => {
      return a + b;
    }, 0);
    let arr2Sum = arr2.reduce((a, b) => {
      return a + b;
    }, 0);
    return arr1Sum > arr2Sum ? 1 : arr1Sum < arr2Sum ? -1 : 0;
  }
};

// 테스트
console.log(solution([49, 13], [70, 11, 2]));
console.log(solution([100, 17, 84, 1], [55, 12, 65, 36]));
console.log(solution([1, 2, 3, 4, 5], [3, 3, 3, 3, 3]));


7. 특이사항

처음엔 아래과 같이 적었는데

const solution = (arr1, arr2) => {
  if (arr1.length !== arr2.length) {
    // 배열의 길이가 다르다면
    return arr1.length > arr2.length ? 1 : -1;
  } // 배열의 길이가 같다면
  else {
    return arr1.reduce((a, b) => {
      return a + b;
    }, 0) >
      arr2.reduce((a, b) => {
        return a + b;
      }, 0)
      ? 1
      : arr1.reduce((a, b) => {
          return a + b;
        }, 0) <
        arr2.reduce((a, b) => {
          return a + b;
        }, 0)
      ? -1
      : 0;
  }
};

채점 결과 계산 시간이 좀 오래 걸리는 부분이 있었다.

테스트 1 〉	통과 (0.07ms, 33.4MB)
테스트 2 〉	통과 (0.06ms, 33.5MB)
테스트 3 〉	통과 (0.07ms, 33.4MB)
테스트 4 〉	통과 (0.22ms, 33.4MB)
테스트 5 〉	통과 (0.06ms, 33.4MB)
테스트 6 〉	통과 (0.14ms, 33.4MB)
테스트 7 〉	통과 (0.10ms, 33.5MB)
테스트 8 〉	통과 (0.04ms, 33.4MB)
테스트 9 〉	통과 (0.07ms, 33.5MB)
테스트 10 〉	통과 (0.04ms, 33.4MB)
테스트 11 〉	통과 (0.05ms, 33.4MB)
테스트 12 〉	통과 (0.04ms, 33.5MB)
테스트 13 〉	통과 (0.21ms, 33.4MB)
테스트 14 〉	통과 (0.04ms, 33.4MB)
테스트 15 〉	통과 (0.14ms, 33.5MB)
테스트 16 〉	통과 (0.25ms, 33.5MB)
테스트 17 〉	통과 (0.14ms, 33.5MB)
테스트 18 〉	통과 (0.08ms, 33.4MB)
테스트 19 〉	통과 (0.14ms, 33.5MB)
테스트 20 〉	통과 (0.06ms, 33.6MB)
테스트 21 〉	통과 (0.04ms, 33.5MB)
테스트 22 〉	통과 (0.04ms, 33.6MB)
테스트 23 〉	통과 (0.06ms, 33.5MB)
테스트 24 〉	통과 (0.04ms, 33.5MB)
테스트 25 〉	통과 (0.06ms, 33.5MB)

 

reduce 같이 배열 메소드는 배열의 모든 요소를 확인하느라 오래걸릴텐데

그걸 여러번 적다니 런타임 에러가 나올 수도 있었던 문제다.

 

삼항연산자 적는데 재미들려서 제일 중요한걸 놓쳤었다.

 

reduce 내용을 변수에 선언해주는 방법으로 수정했고,

연산 시간을 줄일 수 있었다.

테스트 1 〉	통과 (0.04ms, 33.5MB)
테스트 2 〉	통과 (0.06ms, 33.4MB)
테스트 3 〉	통과 (0.04ms, 33.4MB)
테스트 4 〉	통과 (0.06ms, 33.5MB)
테스트 5 〉	통과 (0.04ms, 33.6MB)
테스트 6 〉	통과 (0.06ms, 33.4MB)
테스트 7 〉	통과 (0.06ms, 33.4MB)
테스트 8 〉	통과 (0.07ms, 33.5MB)
테스트 9 〉	통과 (0.04ms, 33.4MB)
테스트 10 〉	통과 (0.06ms, 33.5MB)
테스트 11 〉	통과 (0.04ms, 33.5MB)
테스트 12 〉	통과 (0.04ms, 33.4MB)
테스트 13 〉	통과 (0.06ms, 33.5MB)
테스트 14 〉	통과 (0.06ms, 33.4MB)
테스트 15 〉	통과 (0.06ms, 33.5MB)
테스트 16 〉	통과 (0.06ms, 33.5MB)
테스트 17 〉	통과 (0.06ms, 33.4MB)
테스트 18 〉	통과 (0.09ms, 33.5MB)
테스트 19 〉	통과 (0.09ms, 33.4MB)
테스트 20 〉	통과 (0.06ms, 33.5MB)
테스트 21 〉	통과 (0.05ms, 33.4MB)
테스트 22 〉	통과 (0.06ms, 33.5MB)
테스트 23 〉	통과 (0.04ms, 33.5MB)
테스트 24 〉	통과 (0.04ms, 33.5MB)
테스트 25 〉	통과 (0.04ms, 33.4MB)


8. 다른 사람이 작성한 답

8-1.

const solution = (arr1, arr2) => {
    return arr1.length !== arr2.length ? compare(arr1.length, arr2.length) : compare(arr1, arr2, "reduce");
};

const compare = (a, b, option) => {
    if (option === "reduce") {
        a = a.reduce((acc, cur) => acc + cur);
        b = b.reduce((acc, cur) => acc + cur);
    }
    return a > b ? 1 : a < b ? -1 : 0;
};