코딩 기초 트레이닝 Day 12 with Java

2024. 5. 14. 20:05코딩테스트 리뷰(프로그래머스)/코딩 기초 트레이닝 with Java

문제.1 - 리스트 자르기

https://school.programmers.co.kr/learn/courses/30/lessons/181897

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명
정수 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 함수를 완성해주세요.
import java.util.*;
class Solution {
    public int[] solution(int n, int[] slicer, int[] num_list) {
        ArrayList<Integer> result = new ArrayList<>();
        int start_num = 0, end_num = num_list.length, count = 1;
        switch( n ) {
            case 1 : {
                end_num = slicer[1];
            }
                break;
            case 2 : {
                start_num = slicer[0];
            }
                break;
            case 3 : {
                start_num = slicer[0];
                end_num = slicer[1];
            }
                break;
            case 4: {
                start_num = slicer[0];
                end_num = slicer[1];
                count = slicer[2];
            }
        }
        
        for ( int i = start_num; i <= end_num && i < num_list.length; i += count ) {
            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;
    }
}

 

문제 해설

a, b, c 를 간단하게 바꾸면 a는 시작 인덱스, b는 끝나는 인덱스, c는 간격이다

switch 문에서 시작인덱스, 끝인덱스, 간격을 초기화한다음

마지막에서 arraylist 에 넣고 int[] 로 변형하였다.

 

 

 

 

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

https://school.programmers.co.kr/learn/courses/30/lessons/181896

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명
정수 리스트 num_list 가 주어질 때, 첫 번쨰로 나오는 음수의 인덱스를 return 하는 solution 함수를 완성해주세요. 음수가 없다면 -1을 return 합니다.
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 ) return i;
        }
        return answer;
    }
}

 

 

 

문제.3 - 배열 만들기 3

https://school.programmers.co.kr/learn/courses/30/lessons/181895

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명
정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다.
intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다.
이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해주세요.
import java.util.ArrayList;
class Solution {
    public int[] solution(int[] arr, int[][] intervals) {
        ArrayList<Integer> result = new ArrayList<>();
        for ( int[] interval : intervals ) {
            for( int i = interval[0]; i <= interval[1] && i < arr.length; i++) {
                result.add(arr[i]);
            }
        }
        
        
        int[] answer = new int[result.size()];
        for( int i = 0; i < result.size(); i++ ) {
            answer[i] = result.get(i);
        }
        return answer;
    }
}

 

 

 

문제.4 - 2의 영역

https://school.programmers.co.kr/learn/courses/30/lessons/181894

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명
정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해주세요.
단, arr에 2가 없는 경우 [-1]를 return 합니다.
import java.util.*;
class Solution {
    public int[] solution(int[] arr) {
        // ArrayList<Integer> result = new ArrayList<>();
        
        int start_point = -1, end_point = 0;
        
        //시작점 찾기
        for( int i = 0; i < arr.length; i++ ) {
            if( arr[i] == 2 ) {
                start_point = i;
                break;
            }
        }
        // start_point 가 -1 인 경우 2가 없음
        if( start_point == -1 ) return new int[]{-1};
        
        // 끝나는점 찾기
        for( int i = arr.length-1; i > 0; i-- ) {
            if( arr[i] == 2) {
                end_point = i;
                break;
            } 
        }
        // 시작점 과 끝점이 같으면 2는 하나
        if( start_point == end_point ) return new int[]{2};
        
        return Arrays.copyOfRange(arr, start_point, end_point+1);
    }
}

 

 

 

문제.5 - 배열 조각하기

https://school.programmers.co.kr/learn/courses/30/lessons/181893

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명
정수 배열 arr와 query가 주어집니다.
query를 순회하면서 다음 작업을 반복합니다.

- 짝수 인덱스에서는 arr에서 query[i]번 인덱스를 제외하고 배열의 query[i] 번 인덱스 뒷부분을 잘라서 버립니다.
- 홀수 인덱스에서는 arr에서 query[i]번 인덱스는 제외하고 배열의 query[i] 번 인덱스 앞부분을 잘라서 버립니다.

위 작업을 마친 후 남은 arr의 부분 배열을 return 하는 solution 함수를 완성해주세요.
import java.util.*;
class Solution {
    public int[] solution(int[] arr, int[] query) {
        int[] answer = arr;
        // answer 배열을 계속 변형
        for( int index = 0; index < query.length; index++) {
            if( index % 2 == 0 ) {
                // 짝수 일때 처음부터 query[index] 까지 자르기
                answer = Arrays.copyOfRange(answer, 0, query[index]+1);
            } else {
           		// 홀수 일때 query[index]~ 배열끝 까지 자르기
                answer = Arrays.copyOfRange(answer, query[index], answer.length);
            }
        }
        return answer;
    }
}

 

 

문제 해설

문제 설명이 읽기가 어렵게 되어있어서 추가적인 설명을 남깁니다.

 

문제 설명에서 인덱스가 2개가 나오는데,

짝수 , 홀수 인덱스는 위에 코드에서 보이는 index를 말합니다.

그리고 query[i] 번 인덱스는 arr 자르는 위치을 의미합니다.

 

즉, for 문 안에 index가 짝수, 홀수를 확인하고, query[index]를 확인하여 index뒷 부분을 자르는 건지 앞부분을 자르는 건지 확인하면됩니다.

 

예시)

arr = [0,1,2,3,4,5]

query = [4,1,2]

result = [1,2,3]

 

query[0] = 4 일때, 

index는 0(짝수) 이므로 arr[4]를 제외한 뒷 부분을 잘라버립니다.

arr = [0,1,2,3,4] 

 

query[1] = 1 일때,

index는 1(홀수) 이므로 arr[1] 를 제외한 앞부분을 잘라버립니다.

arr = [1,2,3,4]

 

query[2] = 2 일때,

index는 2(짝수) 이므로 arr[2] 를 제외한 뒷부분을 잘러버립니다.

arr = [1,2,3]

 

즉, arr = [1,2,3] return 합니다.

 

 

 

느낀점

코딩 기초 트레이닝 한 10일짜리인줄 알았는데 확인해보니 25일까지 있더군요..

산타면서 다 온거같은데 아직 중간인 느낌입니다 ㅋ