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
[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
'개인 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 문자열로 변환 (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 |