Develop
[프로그래머스] 수열과 구간 쿼리2 본문
문제
내풀이
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
stream을 이용해서 코드짜는데 참고한 글(역시 내가 정리한 글이 제일 편하다ㅎㅎ)
https://sseb32310.tistory.com/38
+)
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
for문과 IntSream.range의 차이점
: for문은 조건을 만족할 때 break를 넣어 중간에 빠져나올 수 있지만
IntStream.range는 모두 실행 후 결과를 반환해준다.
참고한 글
[Java] IntStream 을 이용한 반복.. : 네이버블로그 (naver.com)
'개인 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 문자열로 변환 (int -> String 변환 방법 3가지) (0) | 2024.01.28 |
---|---|
[프로그래머스] Error :: bad return type in lambda expression (0) | 2024.01.27 |
[프로그래머스] 수 조작하기2 (0) | 2024.01.26 |
[프로그래머스] 수 조작하기1 (1) | 2024.01.25 |
[프로그래머스] 마지막 두 원소 (0) | 2024.01.24 |