본문 바로가기
코딩테스트 연습

리스트 자르기

by 신재은👩🏼‍💻 2024. 4. 22.

문제 설명

정수 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 함수를 완성해주세요.

 

제한사항

  • n 은 1, 2, 3, 4 중 하나입니다.
  • slicer의 길이 = 3
  • slicer에 담긴 정수를 차례대로 a, b, c라고 할 때
  • 5 ≤ num_list의 길이 ≤ 30
  • 0 ≤ num_list의 원소 ≤ 100

 

입출력 예

n slicer num_list result
3 [1, 5, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 3, 4, 5, 6]
4 [1, 5, 2] [1, 2, 3, 4, 5, 6, 7, 8, 9] [2, 4, 6]

import java.util.*;

class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        int a = slicer[0];
        int b = slicer[1];
        int c = slicer[2];
        ArrayList<Integer> resultList = new ArrayList<>();

        switch(n) {
            case 1:
                // num_list의 0번 인덱스부터 b번 인덱스까지
                for (int i = 0; i <= b; i++) {
                    resultList.add(num_list[i]);
                }
                break;
            case 2:
                // num_list의 a번 인덱스부터 마지막 인덱스까지
                for (int i = a; i < num_list.length; i++) {
                    resultList.add(num_list[i]);
                }
                break;
            case 3:
                // num_list의 a번 인덱스부터 b번 인덱스까지
                for (int i = a; i <= b; i++) {
                    resultList.add(num_list[i]);
                }
                break;
            case 4:
                // num_list의 a번 인덱스부터 b번 인덱스까지 c 간격으로
                for (int i = a; i <= b; i += c) {
                    resultList.add(num_list[i]);
                }
                break;
        }
        
        // ArrayList를 배열로 변환
        int[] result = new int[resultList.size()];
        for (int i = 0; i < resultList.size(); i++) {
            result[i] = resultList.get(i);
        }
        return result;
    }
}


이게 최선인가?

 

간격 둘 때는 for문 사용하는 거 아니면 iterate 써야 하는 거 같은데 지금 나는 이 이상은 못 하겠다.

 

라고 생각했는데...

 

class Solution {

    public int[] solution(int n, int[] slicer, int[] num_list) {

        int start = n == 1 ? 0 : slicer[0];

        int end = n == 2 ? num_list.length - 1 : slicer[1];

        int step = n == 4 ? slicer[2] : 1;

        int[] answer = new int[(end - start + step) / step];

        for (int i = start, j = 0; i <= end; i += step) {

            answer[j++] = num_list[i];

        }

        return answer;

    }

}

 

머리에서 제대로 돌려 보진 않았지만 귀감이 될 좋은 코드라고 생각한다...

 

직접 계산 다 해 보고 저렇게 구분한 걸까?

'코딩테스트 연습' 카테고리의 다른 글

조건에 맞게 수열 변환하기 2  (0) 2024.04.22
커피 심부름  (0) 2024.04.22
2의 영역  (0) 2024.04.22
세 개의 구분자  (0) 2024.04.22
주사위 게임 3  (0) 2024.04.22