저장을 습관화

프로그래머스 LV.0 마지막 두 원소 본문

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

프로그래머스 LV.0 마지막 두 원소

ctrs 2023. 9. 16. 20:30

프로그래머스 LV.0 마지막 두 원소

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

 

프로그래머스

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

programmers.co.kr

 

1. 문제 명

LV.0 마지막 두 원소


2. 문제 설명

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.


3. 제한 사항

- 2 ≤ num_list의 길이 ≤ 10

- 1 ≤ num_list의 원소 ≤ 9


4. 예시

num_list result
[2, 1, 6] [2, 1, 6, 5]
[5, 2, 1, 7, 5] [5, 2, 1, 7, 5, 10]


5. 기본 제공 코드

function solution(num_list) {
    var answer = [];
    return answer;
}


6. 제출한 내 답

const solution = (num_list) => {
  if (num_list.reverse()[0] > num_list[1]) {
    let push = num_list[0] - num_list[1];
    num_list.unshift(push);
    return num_list.reverse();
  } else {
    let push = num_list[0] * 2;
    num_list.unshift(push);
    return num_list.reverse();
  }
};

 

6-2. VSC에 작성한 내용

const solution = (num_list) => {
  if (num_list.reverse()[0] > num_list[1]) {
    // console.log(num_list[0]);
    // console.log(num_list[1]);
    let push = num_list[0] - num_list[1];
    // console.log(push);

    // return num_list.reverse().push(push);
    num_list.unshift(push);
    return num_list.reverse();
  } else {
    // console.log(num_list[0]);
    // console.log(num_list[1]);
    let push = num_list[0] * 2;
    // console.log(push);
    num_list.unshift(push);
    return num_list.reverse();
  }
};

// 테스트
console.log(solution([2, 1, 6]));
console.log(solution([5, 2, 1, 7, 5]));


7. 특이사항

7-1. .reverse()

배열 메소드 reverse()는 한번 적용하면 그대로 배열이 고정된다는 것을 다시금 알게 되었다.

다른 메소드처럼 그때 잠깐 적용된 상태로 결과를 출력하는게 아닌, 그 상태 그대로 굳어진다는 것을

 

따라서 만약 배열 num_list가 [5, 2, 1, 7, 5] 일때

if (num_list.reverse()[0] > num_list.reverse()[1]) 이라고 적으면

저 한 줄을 처리하는 동안 num_list는 [5, 7, 1, 2, 5], [5, 2, 1, 7, 5] 와 같이 두 번 뒤집히게 된다.

 

7-2. .push()

return 배열.push('값') 처럼 배열에 삽입 메소드를 붙인 그대로 반환하면 

이는 push가 적용된 배열의 길이를 반환하게 된다.

const solution = (num_list) => {
  if (num_list.reverse()[0] > num_list[1]) {
    let push = num_list[0] - num_list[1];

    return num_list.reverse().push(push);
    
  } else {
    let push = num_list[0] * 2;

    return num_list.reverse().push(push);
  }
};


// 테스트
console.log(solution([2, 1, 6])); // 4
console.log(solution([5, 2, 1, 7, 5])); // 6

 

따라서 다시 원본 배열에 끝에 새로운 수를 삽입하고 싶다면(push를 사용하고 싶다면)

뒤집고, 삽입하고, 리턴해 주어야한다.

...
let push = num_list[0] - num_list[1];
num_list.reverse()
num_list.push(push)

return num_list
...

 

7-3. .unshift()

뒤집고, 삽입하고, 리턴하는 것이 마음에 들지 않는다면

push와 반대 방법, 즉 배열의 맨 앞에 삽입하는 unshift를 사용하면 된다.

reverse메소드는 return과 함께 적용하여도 문제가 없으므로

...
let push = num_list[0] - num_list[1];
num_list.unshift(push)

return num_list.reverse()
...

 


8. 다른 사람이 작성한 답

8-1.

function solution(num_list) {
    const [a, b] = [...num_list].reverse();
    return [...num_list, a > b ? (a-b):a*2];
}