관리 메뉴

공부기록용

프로그래머스(LV 0. 배열 조각하기) 본문

✍️문제풀기✍️/JS_Programmers school

프로그래머스(LV 0. 배열 조각하기)

과부하가즈아 2023. 6. 15. 23:12

LV 0. 배열 조각하기

 

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

 

프로그래머스

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

programmers.co.kr

문제 설명

정수 배열 arr와 query가 주어집니다. query를 순회하면서 다음 작업을 반복합니다.

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

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

 

입출력 예

  • arr = [0, 1, 2, 3, 4, 5]
  • query = [4, 1, 2]
  • result = [1, 2, 3]
<풀이 시도 과정>

 처음에는 splice를 사용하고 싶어서 이렇게 작성해봤었다.

let arr = [0, 1, 2, 3, 4, 5]
let query = [4, 1, 2]


let result = []

for (let i = 0; i <= query.length; i++)
  if (i % 2 === 0) {                                
    arr1 = arr.splice(query[-i] + 1)       
  } else if (i % 2 !== 0) {
    result = arr1.splice(query[i + 1])
  }

console.log(result)

return result​

문제 이해를 못해서 자꾸 인덱스 배열의 값을 도출해내려고 함,,, 어차피 query[0]의 값은 4로 나오는데ㅋㅋㅋ 

🔴그래서 배운거1은 
> .at( )은 반환될 값의 인덱스를 받는다. 음수의 인덱스를 전달하면 배열 또는 문자열의 끝에서 계산해서 찾은 요소를 반환 하고 그렇지 않으면 undefined를 반환한다.

let a = [4, 1, 2, 5]
console.log( a.at(3) % 2) // .at(3) -> 5, 5 % 2 = 1

.at이라는 걸 알게 됬는데 뭐,, 뭐든 알게 됬으니 좋은거라 생각!

🔴 배운거2
> .splice(start: number_시작위치의 인덱스번호, deleteCount: number_지울 갯수, 그자리에 대신 할 요소)

> .slice와의 차이

> splice는 배열의 원본 자체를 건드리고, slice는 배열의 원본은 건드리지 않는다.
> splice는 삭제된 요소를 반환하지만, slice는 빠지고 남는 요소들이 반환된다.

let arr = [0, 1, 2, 3, 4, 5]
let query = [4, 1, 2]

// console.log(arr.splice(0, query[0])) // (0부터 4개제거)제거된 요소를 출력 [ 0, 1, 2, 3 ]
// console.log(arr.splice(0, query[1])) // (0부터 1개제거)제거된 요소를 출력[ 0 ]
// console.log(arr.splice(query[0])) // (4부터 제거)[ 4, 5 ]
// console.log(arr.splice(query[0]+1)) // [ 5 ]
// console.log(arr.splice(query[0 + 1])) // [ 1, 2, 3, 4, 5 ]

 

여기서 내가 헷갈렸던 이유는 splice가 삭제된 요소를 반환하는 것인데 자꾸 삭제된 걸 출력하는 예제로 보다보니 splice자체를 삭제 후 남은걸 반환한다고 생각했었다. 깨달음,,,,굳

splice에 대한 내 잘못된 생각을 고쳐먹고 다시 생각을 해보니!

<해결1>

function solution(arr, query) {
    for (let i = 0; i < query.length; i++) {
        if (i % 2 === 0 ) {
            arr.splice(query[i]+1, 1);
        } else {
            arr.splice(0, query[i]);
        }
    }
    return arr;
}
console.log(solution([0, 1, 2, 3, 4, 5], [4, 1, 2]));

이렇게 작성했더니 됬다.

for (let i = 0; i < query.length; i++) {
        if (i % 2 === 0 ) {
            arr.splice(query[i]+1, 1);
        } else {
            arr.splice(0, query[i]);
        }

> i=0 -> 0%2도 0, 
> arr = [0, 1, 2, 3, 4, 5]에서 arr.splice(query[0] + 1, 1)를 통해 .splice(4 + 1, 1) -> (5, 1) -> 5가 제거
> [0, 1, 2, 3, 4]
> i=1 -> 1%2는 0이 아니므로
> arr.splice(0, query[i]) -> (0, 1) -> 0번째에서 1개 제거니까 
> [1, 2, 3, 4]
> i=2 -> 2%2===0
> arr.splice(query[i] + 1, 1) -> (3, 1) -> 3번째에서 1개 제거로 4가 제거
> [1, 2, 3]이 최종이 되는 것!!!!!

🔴배운거 3
>  0인 짝수로 나오면 거짓으로 판단하고, 1인 홀수로 나오면 참으로 판단한다는 것(0,1만 사용)

이때 참고 하는 걸로는 조건식으로 0,1의 값을 활용해 참, 거짓을 이용한다는걸 알게 되었다

그리 삼항연산으로 간단하게 바꿀 수 있을 것 같아서 바꿔봤는데,

> 조건 ? 참(1)일때의 값 : 거짓(0)일때의 값

<해결2>

function solution(arr, query) {
    for (let i = 0; i < query.length; i++) {
        i % 2 ? arr.splice(0, query[i]) : arr.splice(query[i]+1, 1);
    }
    console.log(arr) // [ 1, 2, 3 ]
    return arr; 
}

console.log(solution([0, 1, 2, 3, 4, 5], [4, 1, 2])); // [ 1, 2, 3 ]


삼항연산으로 

i % 2 ? arr.splice(0, query[i]) : arr.splice(query[i] + 1);

> 0이 거짓으로 판단되므로 거짓일 때의 출력 식은 ':' 뒤에 작성해주면 된다.
 > i % 2 의 값이 0또는 1이 나올것이고
> 참이되는 1이 나오면 arr.splice(0, query[i])
> 거짓이 되는 0이 나오면 arr.splice(query[i]+1, 1)
> 위와 같은 반복이 된다. 


function solution(arr, query) {
  let temp = []

  for (i in query) {
    if (i % 2) {
      temp = arr.slice(query[i])
      arr = [...temp]
    } else {
      temp = arr.slice(0, query[i] + 1);
      arr = [...temp]
    }
  }
  return arr;
}
function solution(arr, query) {

  let answer = [...arr];
  var f = 0;
  var e = 0;

  for (let i = 0; i < query.length; i++) {

    if (i % 2 === 0) {//짝수
      e = f + query[i];
      //answer = answer.slice(0,query[i])
    } else if (i % 2 === 1) {//홀수
      f = f + query[i];
      //answer = answer.slice(query[i],answer.length);
    }
  }

  answer = answer.slice(f, e);

  return answer.length > 0 ? answer : [-1]
}
Comments