Develop

[프로그래머스] 수열과 구간 쿼리2 본문

개인 공부/프로그래머스

[프로그래머스] 수열과 구간 쿼리2

개발 기록 2024. 1. 27. 14:12

문제

 

 

내풀이

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        int z = 0;
        int check=0;
        int answerMin = 10000001;

        // for문 - 배열의 길이 만큼 
        for(int i=0; i < queries.length; i++){
            check = 0; // 0으로 리셋
            answerMin = 10000001; // 10000001로 리셋
            // 범위에 해당하는 arr값 중(for) k보다 큰 값을(if) answer에 넣기
                for(int x=0; x < queries[i][1]-queries[i][0]+1; x++){ // arr의 범위
                   if(arr[x+queries[i][0]] > queries[i][2]){ // k보다 큰 값이면
                        answerMin = Math.min(answerMin,arr[x+queries[i][0]]);
                        check=1;
                   }; // if
                } // for x  

               // 해당하는 값이 없을 경우
                if(check==0){
                    answer[z] = -1;
                }else{
                    answer[z] = answerMin;
                }
                z++;
            } // for i
        return answer;
    }
}

 

 

내 풀이2(stream을 사용해서 간략하게 바꿔보기)

import java.util.stream.*;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        
        // for문 대신 IntStream.rangeClosed사용
        return IntStream.range(0,queries.length) // queries 길이만큼 반복 // 배열의 index는 0부터 시작하기 때문에 시작 숫자는 0 이어야한다.
                .map(x -> IntStream.rangeClosed(queries[x][0], queries[x][1]) // [x][1] - [x][0] 만큼 반복
                .map(i -> arr[i]) // i는 index로 생각하면 편함 // 각 배열의 값을 가져옴
                .filter(j -> j > queries[x][2]) // 값이 [x][2] 보다 큰것만 모은다
                .min() // 그 중 가장 작은 값 반환, 
                .orElse(-1)) // 값이 없으면 -1 반환   
                .toArray(); // 배열로 반환
    }
}

 

 

다른풀이1

import java.util.Arrays;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {

        int[] answer = new int[queries.length];
        Arrays.fill(answer, -1);

        for (int idx = 0; idx < queries.length; idx++) {
            int[] query = queries[idx];
            int s = query[0], e = query[1], k = query[2];

            for (int i = s; i <= e; i++) {
                if (k < arr[i]) {
                    answer[idx] = answer[idx] == -1 ? arr[i] : Math.min(answer[idx], arr[i]);
                }
            }

        }

        return answer;
    }

 

 

다른풀이2

import java.util.stream.IntStream;

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = {};
        return IntStream.range(0, queries.length)
                .map(q -> IntStream.rangeClosed(queries[q][0], queries[q][1])
                        .map(i -> arr[i])
                        .filter(i -> i > queries[q][2])
                        .min().orElse(-1)
                ).toArray();
    }
}

 

 

느낀점

stream을 공부해도 계속 익숙한 방법으로 코드를 짜는 느낌이라

그냥 코드를 두번 풀기로 했다.

원래 방식으로 한 번, 스트림으로 한 번

근데 흐름은 알겠는데 적을줄을 몰라서 다른 풀이2를 참고했음

참고만 하려고 했으나 거의 똑같아져버린 코드 ㅎㅎ..;;

 

stream으로 코드짜고 실행시키니까 오류가 났는데 그건 따로 정리함

https://sseb32310.tistory.com/53

 

 

또한 쉬운 내용도 계속 보고 쓰지 않으면 까먹기 때문에 배열에 대해 아주 간단하게 복습도 했다

https://sseb32310.tistory.com/51

 

[JAVA] 다차원 배열

2차원 배열 선언 방법 1. int[][] num = new int[2][3]; 2. int num[][] = new int[2][3]; 3. int num[][] = {{1,2,3},{4,5,6}}; // 초기화도 같이 함 배열 길이 1. num 배열길이 : num.length 위와 같이 선언시 2가 나온다 2. num[0] 배

sseb32310.tistory.com

 

 

stream을 이용해서 코드짜는데 참고한 글(역시 내가 정리한 글이 제일 편하다ㅎㅎ)

https://sseb32310.tistory.com/38

 

[JAVA] 배열(Array)과 스트림(Stream)

배열(Array) 자바에서 배열을 선언하는 방법 // 값 바로 넣기 String[] arr = {배열에 들어갈 값}; int[] arr = {배열에 들어갈 값}; ex) int[] arr = {1,2,3}; // 크기만 지정 String arr[] = new String[배열크기]; int arr[] =

sseb32310.tistory.com

 

+)

Math.min(a,b) 

: a와 b를 비교해서 작은 수 리턴

 

Math.min.apply(null, 배열이름)

: 가장 작은 수 리턴

왜 첫번째 인자에 null을 넣는지는 모른다.. 검색해도 안나옴 ㅠ

나중에 spring안에서 함수 설명을 보던가해야겠다

추측으로는 null값을 제외하는게 아닐까(?)

 

 

+)

반복문 

1. for문

2. IntStream.range(시작, 끝)  or IntStream.rangeClosed(시작, 끝)

 

만약 배열로 반환하려면

IntStream.range(시작, 끝).toArray();

 

range와 rangeClosed는 앞에 정리해둔 내용 참고

https://sseb32310.tistory.com/41

 

[프로그래머스] 카운트 업

문제 내풀이 class Solution { public int[] solution(int start_num, int end_num) { int answer[] = new int[end_num-start_num + 1]; for(int i = 0; start_num System.out.print(e+" ")); // 2 3 4 rangeClosed(시작 수, 끝 수) : 시작 수와 끝 수를 모

sseb32310.tistory.com

 

for문과 IntSream.range의 차이점 

: for문은 조건을 만족할 때 break를 넣어 중간에 빠져나올 수 있지만

IntStream.range는 모두 실행 후 결과를 반환해준다.

 


참고한 글

 

[Java] IntStream 을 이용한 반복.. : 네이버블로그 (naver.com)

 

[Java] IntStream 을 이용한 반복문 | for 문과의 차이점

For 문을 이용한 반복문 1 부터 10까지의 숫자를 출력한다. IntStream 을 이용한 반복문 배열 반환은 아...

blog.naver.com