프로그래머스 Day12 리스트(배열)

리스트 자르기

💫문제 설명💫

정수 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라고 할 때
  0 ≤ a ≤ b ≤ num_list의 길이 - 1
  1 ≤ c ≤ 3
5 ≤ num_list의 길이 ≤ 30
0 ≤ num_list의 원소 ≤ 100

💫입출력 ex💫

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];

        List<Integer> result = new ArrayList<>();

        switch (n) {
            case 1:
                for (int i = 0; i <= b; i++) {
                    result.add(num_list[i]);
                }
                break;
            case 2:
                for (int i = a; i < num_list.length; i++) {
                    result.add(num_list[i]);
                }
                break;
            case 3:
                for (int i = a; i <= b; i++) {
                    result.add(num_list[i]);
                }
                break;
            case 4:
                for (int i = a; i <= b; i += c) {
                    result.add(num_list[i]);
                }
                break;
        }

        int[] answer = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            answer[i] = result.get(i);
        }

        return answer;
    }
}

첫 번째로 나오는 음수

💫문제 설명💫

정수 리스트 num_list가 주어질 때,
첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.

💫제한사항💫

5 ≤ num_list의 길이 ≤ 100
-10 ≤ num_list의 원소 ≤ 100

💫입출력 ex💫

num_list result
[12, 4, 15, 46, 38, -2, 15] 5
[13, 22, 53, 24, 15, 6] -1

문제풀이

class Solution {
    public int solution(int[] num_list) {
        int answer = -1;
        for (int i = 0; i < num_list.length; i++) {
            if (num_list[i] < 0) {
                answer = i;
                break;
            }
        }
        return answer;
    }
}

배열 만들기 3

💫문제 설명💫

정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다.

intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다.
닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.

이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.

💫제한사항💫

1 ≤ arr의 길이 ≤ 100,000
  1 ≤ arr의 원소 < 100
1 ≤ a1 ≤ b1 < arr의 길이
1 ≤ a2 ≤ b2 < arr의 길이

💫입출력 ex💫

arr intervals result
[1, 2, 3, 4, 5] [[1, 3], [0, 4]] [2, 3, 4, 1, 2, 3, 4, 5]

문제풀이

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[][] intervals) {
        // 결과를 담을 ArrayList 생성
        List<Integer> list = new ArrayList<>();
        
        // 첫 번째 구간에 해당하는 값들을 리스트에 추가
        for (int i = intervals[0][0]; i <= intervals[0][1]; i++)
            list.add(arr[i]);
        
        // 두 번째 구간에 해당하는 값들을 리스트에 추가
        for (int i = intervals[1][0]; i <= intervals[1][1]; i++)
            list.add(arr[i]);
        
        // ArrayList를 int 배열로 변환하여 반환
        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}

2의 영역

💫문제 설명💫

정수 배열 arr가 주어집니다.
배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.

단, arr에 2가 없는 경우 [-1]을 return 합니다.

💫제한사항💫

1 ≤ arr의 길이 ≤ 100,000
  1 ≤ arr의 원소 ≤ 10

💫입출력 ex💫

arr result
[1, 2, 1, 4, 5, 2, 9] [2, 1, 4, 5, 2]
[1, 2, 1] [2]
[1, 1, 1] [-1]
[1, 2, 1, 2, 1, 10, 2, 1] [2, 1, 2, 1, 10, 2]

문제풀이

import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        int startIndex = -1; // 2를 처음 만난 인덱스
        int endIndex = -1; // 2를 마지막으로 만난 인덱스

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 2) {
                if (startIndex == -1) {
                    startIndex = i;
                }
                endIndex = i;
            }
        }

        if (startIndex != -1 && endIndex != -1) {
            // 2를 모두 포함하는 가장 작은 연속된 부분 배열을 배열로 반환
            return Arrays.copyOfRange(arr, startIndex, endIndex + 1);
        }

        return new int[]{-1}; // 2를 포함하는 부분 배열이 없는 경우 [-1]을 반환
    }
}

배열 조각하기

💫문제 설명💫

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

query를 순회하면서 다음 작업을 반복합니다.
  짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i]번 인덱스 뒷부분을 잘라서 버립니다.
  홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i]번 인덱스 앞부분을 잘라서 버립니다.
위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해 주세요.

💫제한사항💫

5 ≤ arr의 길이 ≤ 100,000
  0 ≤ arr의 원소 ≤ 100
1 ≤ query의 길이 < min(50, arr의 길이 / 2)
  query의 각 원소는 0보다 크거나 같고 남아있는 arr의 길이 보다 작습니다.

💫입출력 ex💫

arr query result
[0, 1, 2, 3, 4, 5] [4, 1, 2] [1, 2, 3]

문제풀이

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[] query) {
        
        for(int i=0; i < query.length; i++) {
            if (i%2 == 0) {
                arr = Arrays.copyOfRange(arr, 0, query[i]+1);
            } else {
                arr = Arrays.copyOfRange(arr, query[i], arr.length);
            }
        }
        
        return arr;
    }
}

Categories:

Updated:

Leave a comment