[알고리즘] for문 안에서 splice()를 통해 특정 요소 제거하기

Bora.K | 권보라·2023년 12월 6일
0

알고리즘

목록 보기
11/11
post-thumbnail

문제


[프로그래머스 Level.1] 제일 작은 수 제거하기

문제 설명

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

제한 조건

arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.


나의 문제 풀이


1. 문제 분석

  1. arr 배열에서 가장 작은 수를 찾는다.
  2. 가장 작은 수를 제거한다.
  3. 제거 후 arr가 빈 배열이면-1을, 아니면 arr를 반환한다.

2. 해결 방법 생각하기

  • 배열에서 가장 작은 수 찾기
    Mate.min() 메서드를 사용하여 arr배열에서 가장 작은 수를 찾을 수 있다. 다만, 주의해야할 점은 배열 자체를 넣을 수 없기 때문에 Math.min(...arr)처럼 arr를 전개 연산자로 풀어서 넣어야 한다.

  • 배열에서 특정 요소 제거하기
    Array.splice() 메서드를 이용하여 배열에서 특정 값을 제거할 수 있다. for문을 돌려서 arr의 인덱스를 루프를 돌린 후 위에서 찾은 최소값과 일치하는 인덱스를 찾아 제거한다.

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === Math.min(...arr)) {
      arr.splice(i, 1);
      i--;
    }
  • 삼항연산자를 통해 arr가 빈 배열인 경우 -1을 반환하게 한다.
    삼항연산자를 사용하여 arr가 빈 배열 즉, arr.length가 0인 경우 -1을 반환하고,
    아닌 경우 arr를 반환하도록 한다.

3. 코드 구현


오늘 배운 문법

🔎 for문의 끝에 i--를 하는 이유는?

사실 처음에는 i--를 넣지 않고 돌려서 계속 undefined가 떴었다. 아무리 생각해도 왜 그런지 떠오르지 않아서 결국 chatGPT의 힘을 빌렸다. 애정해...

splice 사용 후 루프 인덱스를 조정하기 위해 i--가 필요하다고 한다.
배열에서 splice를 통해 요소를 제거하면 배열의 길이가 줄어들고, 나머지 요소의 인덱스가 이동하게 된다. 사실 처음에는 이해가 안가서 한참을 생각했다. 사실 이해를 못하다가 지금 알고리즘을 정리하면서 완전히 이해했다.

예를 들어 i가 2(arr[2]가 최소값)라고 가정해 보자. 그럼 for문 안에서 2번째 인덱스의 숫자는 splice를 통해 제거가 된다. i--가 없는 상태에서는 for문이 3번째 인덱스 루프를 돌리게 되는데, 2번째 인덱스가 사라지면 3번째 인덱스에 있던 요소가 2번째 인덱스로 이동하게 된다. 다시 말해서 2번째 인덱스를 다시 한번 루프를 돌려야 하기 때문에 i--를 사용하여 인덱스를 하나 낮춰서 루프를 돌리는 것이다.

결론은 i가 없다면 제거한 요소 바로 다음에 오는 요소는 확인을 건너뛰게 되어 잘못된 결과값을 도출할 수 있다. i를 감소시킴으로써 루프가 모든 요소에 대해 올바르게 반복되도록 할 수 있다.

profile
Frontend Engineers

0개의 댓글