JavaScript/알고리즘

프로그래머스 리스트자르기 JS ( case를 여러개 나눌때는 switch문으로 )

hihiha2 2023. 6. 26. 15:37

문제 설명

정수 n과 정수 3개가 담긴 리스트 slicer 그리고 정수 여러 개가 담긴 리스트 num_list가 주어집니다. slicer에 담긴 정수를 차례대로 a, b, c라고 할 때, n에 따라 다음과 같이 num_list를 슬라이싱 하려고 합니다.

  • n = 1 : num_list의 0번 인덱스부터 b번 인덱스까지
  • n = 2 : num_list의 a번 인덱스부터 마지막 인덱스까지
  • n = 3 : num_list의 a번 인덱스부터 b번 인덱스까지
  • n = 4 : num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로

올바르게 슬라이싱한 리스트를 return하도록 solution 함수를 완성해주세요.

 

 

🙋‍♀️ 내 생각

배열을 어디부터 어디까지 자를것인지silcer의 요소들을 num_list의 인덱스로 이용해서 자르는 문제이다.

 

문제는 n의 값이 어떤 값이 들어오는지에 따라서 자르는 인덱스의 값이 달라진다.

특히 n=4일경우에는 c간격으로 잘라야하기때문에 조건이 하나 더 추가돼서 유의해야 할 것같다고 생각했다.

n의 값이 4가지 경우이고, 어떤 값이 들어가는지에 따라서 slice해줘야하는 인덱스가 달라지기때문에 이러한 경우들을 나눠서 처리해야했다. 그래서 if문을 이용해서 문제를 풀었는데, 다 풀고 보니 switch문을 이용하여 case를 나눠서 적는 것이 더 좋았을 것같다.

이렇게 case를 나누는 경우에는 switch문을 이용하는 것을 잊어버리지 말아야겠다!!

 

 

 

✅ 내 코드

function solution(n, slicer, num_list) {
   if(n===1){
      num_list = num_list.slice(0,slicer[1]+1)
   } 
    if(n===2){
        num_list = num_list.slice(slicer[0])
    }
    if(n===3){
        num_list = num_list.slice(slicer[0],slicer[1]+1)
    }
    if(n===4){
        num_list = num_list.slice(slicer[0],slicer[1]+1).filter((_,i)=>i%slicer[2]===0)
    }
    return num_list
}

우선, 제일 처음으로는 if문을 이용해서 n===1, n===2, n===3, n===4인 경우로 경우를 모두 나눠주었다.

 

그런 다음 num_list의 인덱스를 자르기 위해서 slice()를 사용했다. slice()는 begin, end 인덱스를 인자로 받아서 그만큼만 잘라낸다. 

end인덱스는 미포함하는 특징을 가지고 있기때문에 end인덱스+1을 해주어야 end인덱스를 포함하여 자를 수 있다.

 

n===1인 경우를 보면, num_list.slice(0,slicer[1]+1) 을 통해서 num_list의 0번 인덱스부터 b번 인덱스(slicer[1]+1)까지를 자른다.

slice()는 새로운 값을 반환하기 때문에 num_list에 값을 담아서 새롭게 변경된 값을 다시 재할당해준다.

n===2, n===3의 경우도 n===1의 경우와 비슷하게 slice()를 이용해서 인덱스만 바꿔서 풀면 된다.

 

n===4의 경우에만 c간격으로라는 경우가 추가되었기 때문에, 식을 더 추가해준다.

일단 slice()는 위와 동일한 방법으로 한다. slice()를 통해서 begin과 end인덱스를 지정하고 배열을 자르고 필요한 값만 filter()를 통해서 남긴다.

간격으로 쓰이는 값은 c로 slicer의 2번째 인덱스를 의미한다. 이것을 식으로 표시하면 slicer[2]이다. filter를 이용해서 인덱스의 간격을 지정한다. i를 c로 나눠서 나머지가 0인 값들만 남기면 c간격의 인덱스값을 가지고 있는것만 남는다.

 

그런 다음 num_list를 통해서 리턴한다.

 

 

 

 

💻  다른사람 코드중에 배울 것 

function solution(n, slicer, num_list) {
    let [a, b, c] = [...slicer];

    switch(n) {
        case 1:
            return num_list.slice(0, b + 1);
        case 2:
            return num_list.slice(a);
        case 3:
            return num_list.slice(a, b + 1);
        case 4:
            return num_list.slice(a, b + 1).filter((_, idx) => !(idx % c));
    }
}

switch문을 통해서 푼 코드이다.

 

slicer의 인덱스를 이용하는 것이나, n===4인 경우 filter()를 통해서 간격을 지정하는 것도 동일하다. 전반적인 푸는 방법은 동일하지만 나는 if문을 사용한것과 달리 switch문을 사용했다.

 

let [a, b, c] = [...slicer];

우선, 배열의 구조분해할당을 이용하여 slicer의 각각의 요소들을 a,b,c라는 변수에 할당한다.

(나는 이 과정을 하지않았지만 이렇게 만들면 코드의 가독성이 올라갈수 있어서 좋을것같다)

 

그런 다음, switch문을 사용해서 case를 나눴다.

그리고 각각의 case에 맞게 num_list를 자르는 과정을 진행한다.

(이 과정자체는 if문을 사용한 내 코드와 동일하다)

 

 

 

 

🙋‍♀️ 내 생각

slice()가 익숙하면 풀기 어렵지는 않은 문제였다. 그래도 case가 여러개인 경우인데 switch문을 생각하지 못한게 아쉽다.

 

배열의 구조분해할당도 코드의 가독성을 위해서 잘 이용하면 좋을 것 같다.

구조분해할당은 실제 프로젝트할때도 가독성을 위해서 자주 사용하기때문에 이렇게 알고리즘을 풀때도 가독성을 신경쓰면서 코드를 짤 수 있도록 평소에 연습하도록 해야겠다.