Day 7 반복문
Day7 7단계 20231024
- 이 날은 Stream으로 푸는 걸 많이 시도했다.
- 문제 상황에 따라 Stream이 작성이 편할 수도 있지만 아직 활용이 어려웠고, Stream을 쓰는 것이 오히려 복잡하고 오래 걸린것도 많았다.
1. 수열과 구간 쿼리 4
import java.util.*;
import java.util.stream.Stream;
import java.util.stream.Collectors;
class Solution {
public int[] solution(int[] arr, int[][] queries) {
List<Integer> list;
for(int i = 0; i < queries.length; i++) {
int end = queries[i][1];
int cut = queries[i][2];
list = Stream.iterate(queries[i][0], j -> j <= end, j -> j+1)
.filter(j -> j%cut==0)
.mapToIntintValue
.boxed()
.collect(Collectors.toList());
for(int j : list) {
arr[j]++;
}
}
return arr;
}
}
- IntStream을 List<Integer>로 변환하려면 boxed()를 사용하여 int 타입을 Integer로 만들어야 한다.
int[] nums = {1,2,3,4};
List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
2. 배열 만들기 2
import java.util.*;
class Solution {
public int[] solution(int l, int r) {
List<Integer> list = new ArrayList<>();
StringBuilder sb = new StringBuilder();
int first = (l % 5 == 0) ? l : (l / 5 + 1) * 5;
while (first <= r) {
sb.append(first);
String comp = sb.toString();
for (int i = 0; i < comp.length(); i++) {
if (comp.charAt(i) == '5' || comp.charAt(i) == '0') {
if (i == comp.length() - 1) {
list.add(first);
sb.setLength(0);
}
continue;
} else {
sb.setLength(0);
break;
}
}
first += 5;
}
if(list.isEmpty()) {
list.add(-1);
}
return list.streamintValue).toArray(;
}
}
- 다른 사람 풀이 1
- 스트림에서 범위에 해당하는 연속 정수 리스트를 만든 다음, 정규 표현식으로 특정 문자가 들어갔을 때 만족하는 조건을 기준으로 정수를 필터링한 결과를 배열로 생성
- 0과 5만 포함된 범위 내의 정수의 배열을 만들 때, 정규 표현식을 사용해서 정수를 문자열로 변환한 결과에 [0, 5]가 있는지 확인하고, 해당 문자들을 지웠을 때의 값이 비는 경우의 정수들만 남기기
- 다른 사람 풀이2
- 5와 0으로 이루어 져 있다 -> 0과 1로만 이루어져 있으니 이진법 표현을 사용
4. 콜라츠 수열 만들기
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public int[] solution(int n) {
List<Integer> answer = new ArrayList<>();
answer.add(n);
while (n != 1) {
n = (n%2==0) ? n/2 : n*3+1;
answer.add(n);
}
return answer.streamintValue).toArray(;
}
}
- 결과가 List Collection일 때 배열로 바꾸는 법
- 왜 인지는 모르겠지만 리턴 타입이 int[] 처럼 설정되면 복잡한 과정이 필요했다.
List<Integer> answer = new ArrayList<>();
return answer.streamintValue).toArray(;
- 다른 사람의 stream 풀이
- iterate를 쓸 때 조건이 여러가지 들어갈 수 있다.
return IntStream.concat(
IntStream.iterate(n, i -> i > 1, i -> i % 2 == 0 ? i / 2 : i * 3 + 1),
IntStream.of(1))
.toArray();
class Solution {
public int[] solution(int n) {
return Stream.iterate(n, i -> i >= 1, i -> i == 1 ? 0 : i % 2 == 0 ? i / 2 : 3 * i + 1)
.mapToIntintValue).toArray(;
}
}
- https://zorba10004.tistory.com/401 에서 IntStream.iterate()와 Stream.iterate()의 차이를 확인