본문 바로가기
알고리즘/Programmers

[TIL] 2023.06.03 Programmers_배열 조각하기

by heereal 2023. 6. 3.

배열 조각하기

문제 설명

정수 배열 arr와 query가 주어집니다.

query를 순회하면서 다음 작업을 반복합니다.

  • 짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.
  • 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.

위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.

 

 

입출력 예

arr query result
[0, 1, 2, 3, 4, 5] [4, 1, 2] [1, 2, 3]
  • 이번에 매번 처리할 query의 값과 처리 전후의 arr의 상태를 표로 나타내면 다음과 같습니다.
query의 값 query 처리 전 query 처리 후 비고
4 [0, 1, 2, 3, 4, 5] [0, 1, 2, 3, 4] 0번 인덱스의 쿼리이므로 뒷부분을 자른다.
1 [0, 1, 2, 3, 4] [1, 2, 3, 4] 1번 인덱스의 쿼리이므로 앞부분을 자른다.
2 [1, 2, 3, 4] [1, 2, 3] 2번 인덱스의 쿼리이므로 뒷부분을 자른다.

 


나의 풀이

function solution(arr, query) {
    let answer = [...arr];
    for (const i in query) {
        if (i % 2 === 0 ) answer = answer.slice(0, query[i] + 1);
        if (i % 2 !== 0 ) answer = answer.slice(query[i]);
    }
    return answer;
}
  1. arr를 복사한 배열 answer를 생성한다.
  2. query에 for문을 사용하여 index가 짝수인지 홀수인지에 따라 각각 slice 메서드를 적용한다.
  3. slice 메서드를 적용한 배열을 다시 answer에 할당한다.
  4. 최종적으로 answer를 return 한다.

 


다른 사람의 풀이

function solution(arr, query) {
  let start = 0;
  let end = arr.length;
  for (let i = 0; i < query.length; i++) {
    i % 2 ? start += query[i] : end = start + query[i];
  }
  return arr.slice(start, end + 1);
}

for문을 돌 때마다 매번 배열을 slice 할 필요 없이 start와 end라는 변수를 선언 후에 for문을 돌며 이 변수들을 재할당 후, 배열은 최종 한 번만 slice해도 된다. 전혀 생각 못했던 방법인데 매번 배열 자체를 수정하는 것보다는 이 풀이가 더욱 효율적일 거 같다 👍

 

확실히 풀이 수정 후 코드 실행 시간이 단축되었음!

 

 

댓글