[오늘의 문제] 제일 작은 수 제거하기

shlim55·2025년 6월 27일

코딩테스트

목록 보기
90/223

출처: https://school.programmers.co.kr/learn/courses/30/lessons/12935

문제 설명
정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

제한 조건
arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
입출력 예
arr return
[4,3,2,1][4,3,2]
[10][-1]

내가 작성한 코드문

import java.util.*;
class Solution {
    public int[] solution(int[] arr) {
        
        List<Integer> list = new ArrayList<>();
        for (int num : arr) {
            list.add(num); // 박싱 필요
        }
       
        // 2. 내림차순 정렬 직접 구현
        list.sort((a, b) -> b - a);
        
        // Collections.sort(list, Collections.reverseOrder());// 내림 차순 정렬
        
        if(list.size() == 1){// 값이 하나일 경우 조건문 순서 변경 
            return new int[]{-1};
            // list.remove(0);// 마지막 값 삭제
            // list.add(-1);
        } else if (!list.isEmpty()) { // arr 에서 가장 작은 수를 제거한 배열을 리턴  
            list.remove(list.size() - 1);// 마지막 값 삭제
        }

        // 리스트 -> 배열 변환
        int answer[] = new int[list.size()];
        
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i); // 언박싱
        }
   
        return answer;
    }
}

코드 실행 했을때는 둘다 맞았다.

근데 제출후 채점 했을 때는 0점이었다.

현재 코드의 큰 문제점은 내림 차순을 해서 마지막 요소를 제거 하는 방식인데

그런 요구사항은 없었다는 것이다.

list.sort((a, b) -> b - a); // 내림차순 정렬
list.remove(list.size() - 1); // 마지막 요소 제거

모범답안

import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        if (arr.length == 1) return new int[]{-1};

        // 1. 최소값 찾기
        int min = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] < min) min = arr[i];
        }

        // 2. 최소값 제거
        List<Integer> list = new ArrayList<>();
        for (int num : arr) {
            if (num != min) list.add(num);
        }

        // 3. 리스트 -> 배열 변환
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }

        return answer;
    }
}

처음부터 arr배열 길이가 1인지 확인후 맞다면 -1로 원소를 바꾼후 시작한다.

최솟값 찾기 아니까 패스

최솟값 아닌 값만 리스트에 저장

리스트 -> 배열로 변환

다른 사람의 풀이

import java.util.Arrays;
import java.util.stream.Stream;
import java.util.List;
import java.util.ArrayList;

class Solution {
  public int[] solution(int[] arr) {
      if (arr.length <= 1) return new int[]{ -1 };
      int min = Arrays.stream(arr).min().getAsInt();
      return Arrays.stream(arr).filter(i -> i != min).toArray();
  }
}

Arrays.stream(arr)
→ arr을 IntStream으로 변환한다. (int[] → IntStream)

.min()
→ 스트림에서 가장 작은 값을 구한다.
리턴값은 OptionalInt 타입이다.

.getAsInt()
→ OptionalInt에서 실제 값을 꺼낸다.

다시 한 번 arr을 스트림으로 변환한다.

.filter(i -> i != min)
→ min 값과 같은 요소는 제거한다 (조건: 같지 않은 것만 통과)

.toArray()
→ 남은 값들을 int[] 배열로 다시 반환한다.

class Solution {
  public int[] solution(int[] arr) {
      if(arr.length == 1){
          int[] answer = {-1};
          return answer;
      }

      int[] answer = new int[arr.length-1];
      int minIndex=0;
	  // 1. 가장 작은 수의 인덱스를 찾는다	
      for(int i=0;i<arr.length;i++){
          if(arr[minIndex]>arr[i]){
              minIndex = i;
          }
      }
      
      // 2. 가장 작은 수를 제거하기 위해 뒤의 값을 한 칸씩 당긴다
      for(int i=minIndex+1;i<arr.length;i++){
          arr[i-1] = arr[i];
      }
      
      // 3. arr 배열 앞부분을 answer에 복사
      for(int i=0;i<answer.length;i++){
          answer[i] = arr[i];
      }
      return answer;
  }
}

마지막거는 리스트 없이 배열만으로 가능한 삭제 알고리즘

profile
A Normal Programmer

0개의 댓글