문제 설명
문자열 배열 intStrs와 정수 k, s, l가 주어집니다. intStrs의 원소는 숫자로 이루어져 있습니다.
배열 intStrs의 각 원소마다 s번 인덱스에서 시작하는 길이 l짜리 부분 문자열을 잘라내 정수로 변환합니다. 이때 변환한 정수값이 k보다 큰 값들을 담은 배열을 return 하는 solution 함수를 완성해 주세요.
제한사항
0 ≤ s < 100
1 ≤ l ≤ 8
10l - 1 ≤ k < 10l
1 ≤ intStrs의 길이 ≤ 10,000
s + l ≤ intStrs의 원소의 길이 ≤ 120
입출력 예
intStrs k s l result
["0123456789","9876543210","9999999999999"] 50000 5 5 [56789, 99999]
import java.util.ArrayList;
class Solution {
public int[] solution(String[] intStrs, int k, int s, int l) {
ArrayList<Integer> arr = new ArrayList<Integer>();
for(int i=0; i<intStrs.length; i++) {
int temp = 0;
temp = Integer.parseInt(intStrs[i].substring(s, s+l));
if(temp > k) {
arr.add(temp);
}
}
int[] answer = arr.stream().mapToInt(i -> i).toArray();
return answer;
}
}
근데 내가 다른 사람들의 답을 보면서 궁금했던 게
'스트림을 배배꼬아 쓰면 성능이 너무 안 좋아서 현업에서 쓸 수 없다'는 말이 진짜인가였다.
import java.util.*;
class Solution {
public int[] solution(String[] intStrs, int k, int s, int l) {
return Arrays.stream(intStrs).mapToInt(value -> Integer.parseInt(value.substring(s, s + l))).filter(value -> value > k).toArray();
}
}
이거랑 내 코드랑 로직 차이 없는 거 같은데 성능 차이가 있을까?
gpt한테 물어 봤다.
벤치마크 테스트 코드는 주는데 자기가 뭐라고 직접적으로 답하진 않는다.
'상황에 따라 다르다'고만 답한다.
스트림이 쓰는 형태에 따라 느리게 동작할 수 있다는 건 충분히 이해가 간다.
답안 제출 시 실제 걸리는 시간에 그게 보이니까.
다만 내가 궁금했던 건 같은 로직을 구현하는 코드인데
하나는 나 같은 코드,
하나는 스트림으로 구현한... 까지 글을 쓸 무렵 떠올랐다.
'내가 직접 프로그래머스에서 테스트 해 보면 되잖아.'
결론: 스트림 쓸 때 2~3배 느리다.