hoon's bLog

Java 프로그래머스 제일 작은 수 제거하기 자바 본문

코딩테스트/프로그래머스

Java 프로그래머스 제일 작은 수 제거하기 자바

개발한기발자 2023. 2. 9. 12:08
반응형

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제 설명]

정수를 저장한 배열, 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]

[먼저 생각해 보기]

먼저 배열에서 작은 수를 어떻게 비교하여 찾아 낼 것인가?

배열 검색에 있어 반복문을 사용하게 되겠구나!?

배열에 -1을 담아 return 할 때는 배열의 길이가 1일 때겠구나!?

이런걸 조금씩 염두하고 코딩하면, 비교적 잘 되는것 같기도 하다 ㅎㅎㅎ

 

[나의 풀이]

import java.util.Arrays;
class Solution {
    public int[] solution(int[] arr) {
        int[] answer = {};
        
        if (arr.length == 1)
        	answer = new int[]{-1};
        else{
            int[] org = Arrays.copyOf(arr, arr.length);
            Arrays.sort(arr);
            
            int cnt = 1;
            for (int i = 0; i < arr.length; i++) {
                if (i == 0)
                	continue;
                else{
                    if (Math.min(arr[i-1], arr[i]) == arr[i])
                    	cnt++;
                    else
                    	break;
                }
            }
            
            int idx = 0;
            answer = new int[org.length - cnt];
            
            for (int i = 0; i < org.length; i++) {
                if (org[i] == arr[0])
                	continue;
                else{
                    answer[idx] = org[i];
                    idx++;
                }
            }
        }

        return answer;
    }
}

우선 배열의 길이로 첫번째 분기를 나눈다.

Arrays.copyOf 메서드를 통해 특정 배열을 원하는 길이만큼 복사 할 수 있다. 사용법은 다음과 같다.

Arrays.copyOf(원본 배열, 원본 배열에서 복사하고 싶은 요소들의 길이)

그리고 Arrays.sort로 정렬 후, Math 클래스의 Math.min을 이용하여 최솟값을 찾아, cnt를 1씩 더해준다.

이때 cnt가 1인 이유는 가장 작은수가 인덱스 0인 위치에 올 것이고,

최소값이 인덱스=1 인 경우는, 최소값이 2개 이상인 경우!!

따라서 최소값이 한 개인 경우를 생각해 기본값이 1인 것이다.

이후, return 할 answer 배열의 길이를 최솟값 개수만큼 빼 선언해주고,

인덱스가 0인 값과 비교하여 다른 값에 대해서 return할 배열에 넣어주면 끝!

[다른 사람들의 풀이]

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

class Solution {
  public int[] solution(int[] arr) {
      if (arr.length == 1) {
            arr[0] = -1;
            return arr;
        } else {
            ArrayList<Integer> arrayList = new ArrayList<Integer>();
            
            for (int a : arr) {
                arrayList.add(a);
            }
            
            Integer minimum = Collections.min(arrayList);
            arrayList.remove(minimum);
            
            int[] resultArray = new int[arr.length - 1];
            
            for (int i = 0; i < arrayList.size(); ++i) {
                resultArray[i] = arrayList.get(i);
            }
            
            return resultArray;
        }
  }
}

우선 배열의 길이가 1일 때 별도 선언 없이 전달받은 arr에 -1을 담아 return!!

굳이 새로 선언하지 않아도 됐다...

이후 ArrayList를 이용해 arr의 원소들을 순서대로 넣어주고,

Collection.min()을 이용해, 최소값을 찾는다!

단, Collection.min() 메서드는 인자로 리스트만 받기 때문에, 지금처럼 전달받는 값이 배열이라면,

길이가 길어질수록 성능이 떨어지게 된다.

 

여튼, 찾은 최소값을 remove() 함수를 통해 제거하고,

return 할 resultArray에 다시 순서대로 꺼내 담아주면 끝!

[정리]

개인 피셜 난이도 : ★

쉬운 축에 속하는 문제이지만 분기를 나눠, 주어진 배열 데이터를 처리하는 부분을

공부할 수 있었던 좋은 문제였던것 같다!

간혹 Stream을 쓰시는 분들도 계시는데, 정말이지 예술인 것 같다...

조만간 Stream에 대한 문법을 정리하며 관련 풀이들도 예제로 하여 같이 포스팅 할 예정이다.

 

추가로, 난이도 한개도 아까울만큼 쉬워서 포스팅 건너뛴 문제들도 있다.

그런 문제들은 아래 내 github에서 검색하여 소스 참고하면 되겠다!

https://github.com/chrishoonS/codeTest

 

GitHub - chrishoonS/codeTest: programmers codeTest

programmers codeTest. Contribute to chrishoonS/codeTest development by creating an account on GitHub.

github.com

 

언제나 새로운 정보 공유와 잘못된 정보

비판/지적/태클은 환영입니다!

 

끝.

728x90
반응형