정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.
변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.
위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.
아래와 같이 코드를 작성하니 테스트 케이스는 통과했는데, 제출하고 런타임 에러가 확인되었다. 통틀어 처음 보는 에러라 찾아봤더니 다음과 같다고 한다.
런타임 에러 (출처)
- 실행 시 발생하는 에러
- 프로그램이 컴파일 된 후 실행하면서 에러 발생
- 대체러 개발 시 설계 미숙(논리적)으로 발생하는 에러
- 에러 발생 시 프로그래머가 역추적해서 원인 확인해야 함
- 예시)
NullPointerException
무한 루프
0으로 나누는 경우 등
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
int[] stk = {};
for(int i=0;i<arr.length;){
if(stk.length == 0){
stk = new int[1];
stk[i] = arr[i];
i++;
}else{
if(stk[stk.length - 1] < arr[i]){
stk = Arrays.copyOf(stk, stk.length+1);
stk[stk.length - 1] = arr[i];
i++;
}else{
stk = Arrays.copyOf(stk, stk.length-1);
}
}
}
return stk;
}
}
1번 경우와 2번 경우 실행해야 하는 코드가 동일하지만 경우의 수는 나누어 주어야 한다는 게 영 마음에 들지 않는다.
코드를 조금이라도 줄일 수 있는 방법이 없을까 다른 분들의 답을 찾아 보다가 stream의 mapToInt를 사용한 걸 봤다. 처음 보는 코드라 공부해야겠다고 생각했다.
import java.util.*;
class Solution {
public int[] solution(int[] arr) {
List<Integer> result = new ArrayList<>();
for(int i=0;i<arr.length;){
if(result.size() == 0){
result.add(arr[i]);
i++;
}else if(result.size() != 0 && result.get(result.size() - 1) < arr[i]){
result.add(arr[i]);
i++;
}else {
result.remove(result.size() - 1);
}
}
int[] stk = new int[result.size()];
for(int i=0;i<result.size();i++){
stk[i] = result.get(i);
}
return stk;
}
}
