코딩과 결혼합니다

230621 - 프로그래머스 제일 작은 수 제거하기/ 오류와 해결과정 본문

2세/기타

230621 - 프로그래머스 제일 작은 수 제거하기/ 오류와 해결과정

코딩러버 2023. 6. 21. 21:16
728x90

어제부터 계속해서 풀리지 않던 문제가 있었다.

그것은 바로!

 

제일 작은 수 제거하기

풀이

더보기
public static void main(String[] args) {
       int[] arr = {4,3,2,1};
       int num = arr[0];
       int a = arr.length;
       //요소가 1개일때
       if (arr.length == 1){
           return new int[]{-1};
       }

int[] arr = {4,3,2,1) 을 예시로 코드가 어떻게 진행되는지 설명해보겠다.

1. 먼저 num이라는 int형 변수를 선언하고 arr의 아무 숫자나 넣어준다. 나는 가장 첫번째 요소를 넣어주었다. //4

2. 이 문제에서는 배열의 요소가 딱 한 개인 경우도 있는데 그때는 -1이 라는 결과값을 내어주라 했으므로,  if 문으로

     그 경우를 먼저 걸러내준다.


      //최솟값 구하기
      for (int i = 0; i < a; i++) {
            if (num > arr[i]){
                num = arr[i];
            }
      }

3. 최솟값은 arr[i] 가 num보다 작았을때, 그 arr[i]의 요소가 num이 되도록 해주었다. //최솟값 = 1


     //최솟값 없는 배열 만들기
     
     int[] newArr = new int[a-1];
     for (int i = 0; i < a-1; i++) { 
            if (arr[i] != num) {
                newArr[i] = arr[i];
             }
      }

4.

오류 : for (int i = 0; i < a-1; i++) 

이유 : a-1을 하면 arr의 요소를 다 돌지 않고 끝낸다.

해석 : arr이 4,3,2,1 일때는 1이 마지막 인덱스에 위치해 있어서 언뜻 보면 가능해 보이지만 1의 위치가 다른 곳 (4,1,2,3 이라고 해보자)에 있다면 (arr[i] != num)의 조건을 충족하고도 마지막 요소까지 비교해보지 못하고 끝난다. 그리고 newArr의 요소는 {4,0,2}가 된다.

해결 : for (int i = 0; i < a; i++) 

 

5. i < a 로 바꾸어 주었는데 런타임에러로 실패!!

오류 : Index 3 out of bounds for length 3

이유 : "인덱스 3이 길이 3에 대한 경계를 벗어남" 이라고 한다.

해석 : 위와 마찬가지로 arr이 4,1,2,3일때 newArr에는 {4,0,2}가 저장되는데,  마지막 요소 3이 조건을 충족하고 있기 때문에 문제가 발생한다. 3은 newArr에 들어가려 하지만 index의 길이가 짧아서 들어가지 못하고 오류가 난다.

해결 : count 

//count
     int count = 0;   

     int[] newArr = new int[a-1];
     for (int i = 0; i < a; i++) { 
            if (arr[i] != num) {
                newArr[count] = arr[i];
                count++;
            }
      }
      return newArr;
}

6. int count를 0으로 초기화 해준다.

7. if문의 조건을 만족하면 처음에는 newArr[0] = arr[0] 으로 4가 입력되고, 다음 arr의 요소 3과 2도 조건을 만족하므로  newArr 안에 저장이 된다. 하지만 1일 때는 조건을 충족하지 않으므로 count 되지 못하고 밖으로 빠져나간다. 이렇게 하면 count는 조건을 충족하는 것들만 세어주게 되므로 최솟값이 어느 위치에 있든 영향을 주지 못하게 된다.