[프로그래머스/Java] Lv.0 배열 만들기 4

febCho·2024년 3월 4일
0

코딩테스트

목록 보기
35/253
post-thumbnail

문제

정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.

변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.

  • 만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.
  • stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.

위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.

- 제한사항

  • 1 ≤ arr의 길이 ≤ 100,000
  • 1 ≤ arr의 원소 ≤ 100,000

풀이

- 오답

아래와 같이 코드를 작성하니 테스트 케이스는 통과했는데, 제출하고 런타임 에러가 확인되었다. 통틀어 처음 보는 에러라 찾아봤더니 다음과 같다고 한다.

런타임 에러 (출처)

  • 실행 시 발생하는 에러
  • 프로그램이 컴파일 된 후 실행하면서 에러 발생
  • 대체러 개발 시 설계 미숙(논리적)으로 발생하는 에러
  • 에러 발생 시 프로그래머가 역추적해서 원인 확인해야 함
  • 예시)
    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번 경우 실행해야 하는 코드가 동일하지만 경우의 수는 나누어 주어야 한다는 게 영 마음에 들지 않는다.
코드를 조금이라도 줄일 수 있는 방법이 없을까 다른 분들의 답을 찾아 보다가 streammapToInt를 사용한 걸 봤다. 처음 보는 코드라 공부해야겠다고 생각했다.

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;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글