programmers 기초 Day12

Hwani·2024년 6월 12일

프로그래머스 DAY 1~25

목록 보기
38/51

문제 - 리스트 자르기

풀이

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<>();

        if (n == 1) {
            for (int i = 0; i <= b; i++) {
                result.add(num_list[i]);
            }
        } else if (n == 2) {
            for (int i = a; i < num_list.length; i++) {
                result.add(num_list[i]);
            }
        } else if (n == 3) {
            for (int i = a; i <= b; i++) {
                result.add(num_list[i]);
            }
        } else {
            for (int i = a; i <= b; i += c) {
                result.add(num_list[i]);
            }
        }

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

        return answer;
    }
}

설명

  • slicer의 길이는 3으로 고정이기 때문에 slicer[0],[1],[2] 값을 변수로 설정
  • 조건에 따라 값의 길이가 다르기 때문에 ArrayList 생성
  • n도 1,2,3,4 고정이기 때문에 각 조건에 맞게 ArrayList에 담아준다.
  • ArrayList에 담긴 값을 배열에 저장 후 리턴

문제 - 첫 번째로 나오는 음수

풀이

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

        return answer;
    }
}

설명

이 문제는 배열의 값 중 첫번째로 나오는 음수의 인덱스 값을 리턴하는게 핵심이다.

  • for문으로 배열을 순회하고 if문으로 0 보다 작은 배열의 값을 찾는다.
  • 그 값의 i값, 즉 인덱스 번호를 리턴할 answer에 저장 후 리턴한다.

문제 - 배열 만들기 3

풀이

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[][] intervals) {
        ArrayList<Integer> list = new ArrayList<>();

        int a1 = intervals[0][0];
        int b1 = intervals[0][1];
        int a2 = intervals[1][0];
        int b2 = intervals[1][1];

        for (int i = a1; i <= b1; i++) {
            list.add(arr[i]);
        }

        for (int i = a2; i <= b2 ; i++) {
            list.add(arr[i]);
        }

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

설명

이 문제는 배열에서 정해진 범위의 값을 새로운 배열에 담아 리턴하는 문제

  • intervals의 배열의 값은 항상 [a1,b1][a2,b2]로 고정이기 때문에 각각 변수에 저장
  • for문으로 정해진 범위만큼 배열을 순회해서 ArrayList에 담아준다.
  • ArrayList에 담긴 값을 리턴할 배열에 담아주고 리턴한다.

문제 - 2의 영역

풀이

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr) {
        // 초기값으로 배열의 길이보다 큰 값을 가진 변수를 설정
        int firstIndex = 100000, lastIndex = 0;
        // 배열을 순회하면서 숫자 2가 나타나는 첫 인덱스와 마지막 인덱스를 찾음
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 2) {
                firstIndex = Math.min(firstIndex, i);
                lastIndex = Math.max(lastIndex, i);
            }
        }
        // 만약 숫자 2가 배열 안에 존재한다면 해당 부분 배열을 반환 
        if (firstIndex <= lastIndex) {
            return Arrays.copyOfRange(arr, firstIndex, lastIndex + 1);
        } else {    //  그렇지 않다면 {-1}을 반환
            return new int[]{-1};
        }
    }
}

설명

이 문제는 배열 중 첫번째로 나오는 2부터 마지막으로 나오는 2의 범위의 값을 구하는 문제

  • Math.min() 메소드와 Math.max() 메소드를 통해 배열을 순회하며 숫자 2가 나타나는 인덱스를 저장할 수 있다.
  • Arrays.copyOfRange() 메소드는 대상 배열의 지정된 범위를 새 배열로 복사한다. 첫 번째 파라미터는 소스 배열, 두 번째 파라미터는 복사할 범위의 시작 인덱스, 세 번째 파라미터는 복사할 범위의 마지막 인덱스이다.

문제 - 배열 조각하기

풀이

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int[] query) {
        int start = 0;
        int end = arr.length;

        for (int i = 0; i < query.length; i++) {
            if (i % 2 == 0) {
                // 짝수 인덱스: arr에서 query[i] 번 인덱스를 제외하고 그 뒤의 부분을 자름
                end = start + query[i] + 1;
            } else {
                // 홀수 인덱스: arr에서 query[i] 번 인덱스를 제외하고 그 앞의 부분을 자름
                start = start + query[i];
            }
        }

        // 부분 배열 생성
        int[] answer = Arrays.copyOfRange(arr, start, end);

        return answer;
    }
}

설명

이 문제는 배열의 값을 주어진 조건대로 배열을 자르는 문제
문제에서 주어진 조건이 짝수 인덱스는 뒤의 부분을 자르고 홀수 인덱스는 앞의 부분을 자른다.

  • start와 end 변수를 사용하여 슬라이싱할 배열의 시작과 끝 인덱스를 설정
  • query 배열의 각 요소를 순회하면서 start와 end를 업데이트하여 최종 슬라이싱 범위를 결정
  • Arrays.copyOfRange 메서드를 사용하여 지정된 범위의 부분 배열을 생성하고 반환
profile
개발자될거야

0개의 댓글