Algorithm/프로그래머스

[프로그래머스] Level1) 제일 작은 수 제거하기

햄습햄 2021. 10. 15. 12:03

문제 설명

 

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

 

 

제한 조건

 

  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

 


풀이 과정 (자바)

 

가장 작은 수를 제거한 배열이라고 했으므로, 우선 arr.length - 1로 answer 배열을 초기화했다.

그리고 arr.length가 1일 때는 -1을 리턴하라고 했으므로, -1 값을 넣었다.

 

arr.length가 1이 아닌 경우 (2 이상인 경우),

먼저 for문을 돌면서 arr 배열 중 가장 작은 수가 들어있는 index를 찾았다.

그리고 다시 for문 돌면서 answer 배열에 넣어주는데

가장 작은 수가 들어가면 안 되므로 (가장 작은 수를 제거해야 하므로)

해당 index가 되면 continue해서 넘어가고, 계속해서 값을 넣었다.

 

continue와 상관없이 순서대로 값을 넣어야 하므로 answer에 값 넣어질 때마다 k++했다.

 

 

결과

 

 


다른 사람의 풀이

 

arr.length가 1보다 작거나 같으면 바로 -1이 있는 int형 배열을 return했다.

 

가장 작은 수를 제거하기 위해 arr 내의 최솟값을 구해야 했다.

arr 배열에서 스트림 생성 후, 그 중 최솟값을 구했다. 이때, 최솟값을 Optional 객체로 받았다.

그리고 이 값을 int형 변수인 min에 넣어야 하므로, getAsInt()를 통해 int형으로 값을 받았다. 

 

결과를 반환하기 위해

arr 배열에서 스트림 생성 후, 그 중 변수 min (아까 구해둔 최솟값)을 제외한 값을 추출했다.

그리고서 이를 배열로 값을 받아 결과를 반환했다.

(Arrays.stream(배열))

 

 

기타

 

다른 사람의 풀이를 보면 stream으로 처리했다. 확실히 간략하고, 가독성 좋아 보이기는 한데 속도가 너무 느렸다.

 

추가적으로,

arr.length가 1이면 바로 if~else로 처리할 게 아니라 바로 -1을 넣어서 return 처리하면 됐고,

굳이 tmp 변수를 만들지 않고, arr[i] < arr[index]으로 처리해도 됐을 거 같다.