프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 리스트 자르기(Java)

Sigfriede 2023. 5. 14. 01:20

  문제 설명

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

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

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

 

  제한사항

  • n은 1, 2, 3, 4 중 하나입니다.
  • slicer의 길이 = 3
  • slicer에 담긴 정수를 차례대로 a, b, c라고 할 때
    • 0 <= a <= b <= num_list의 길이 - 1
    • 1 <= c <= 3
  • 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.ArrayList;
class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        ArrayList<Integer> list = new ArrayList<>();
        if (n == 1) {
            for (int i = 0; i <= slicer[1]; i++) {
                list.add(num_list[i]);
            }
        } else if (n == 2) {
            for (int i = slicer[0]; i < num_list.length; i++) {
                list.add(num_list[i]);
            }
        } else if (n == 3) {
            for (int i = slicer[0]; i <= slicer[1]; i++) {
                list.add(num_list[i]);
            }
        } else {
            for (int i = slicer[0]; i <= slicer[1]; i += slicer[2]) {
                list.add(num_list[i]);
            }
        }
        
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        return answer;
    }
}

  ArrayList를 생성합니다. answer 배열의 크기가 고정적이지 않기 때문입니다.

  n이 1일 때, for문이 slicer의 1번째 원소만큼 순회합니다. num_list의 i번째 원소를 list에 추가합니다.

  n이 2일 때, for문이 slicer의 0번째 원소부터 num_list의 길이만큼 순회합니다. num_list의 i번째 원소를 list에 추가합니다.

  n이 3일 때, for문이 slicer의 0번째 원소부터 slicer의 1번째 원소까지 순회합니다. num_list의 i번째 원소를 list에 추가합니다.

  앞선 조건에 해당하지 않으면, 즉 n이 4일 때, for문이 slicer의 0번째 원소부터 slicer의 1번째 원소까지 slicer의 2번째 원소의 값만큼 증가합니다. num_list의 i번째 원소를 list에 추가합니다.

  answer 배열을 생성합니다. 길이는 list의 크기와 동일합니다. for문이 list의 크기만큼 순회합니다. answer의 i번째 원소에 list의 i번째 값을 할당합니다. 이는 단순히 리스트를 배열로 변환하는 과정입니다.

  n이 1, 2, 3일 때에는 Arrays 클래스의 copyOfRange 메소드를 이용하여 자를 수도 있습니다. 그러나 4번에서는 쓸 수 없는 탓에 통일성을 위해 list에 추가하는 방법을 이용했지만, 이것이 합리적인 방법이라고 할 수는 없습니다. 본인이 선호하는 방법으로 풀이하면 될 듯 합니다.