개발의 흔적

알고리즘 테스트# 8. 제일 작은 수 구하기 본문

코딩테스트 연습

알고리즘 테스트# 8. 제일 작은 수 구하기

남들에게 도움을 주는 백엔드 개발자가 되자 2020. 7. 21. 17:12

안녕하세요.

 

프로그래머스에 있는 "제일 작은 수 구하기" 알고리즘 문제를 풀어보겠습니다.

 

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

 

출력 : 

[4,3,2,1] [4,3,2]
[10] [-1]

 

코드 : 

 

 

* 문제 해설 *

 

정수 배열 : {4,3,2,1}

 

이문제는 가장 최소값을 구합니다.

최소값과 최소값의 인덱스를 구합니다.

그이유는 최소값의 인덱스를 이용하여 가장 작은값을 제거합니다.

무조건 최소값의 인덱스는 제거가 되기때문에 길이는 기존 정수배열 보다 새로운 배열이 -1작습니다.

그래야 배열의 길이를 맞출수있습니다.

가장 중요한건 배열의 길이에서 자꾸 오류가 날 수 있습니다.

이유는 기존배열의 값이 새로만든 배열의 최소값을 제거하면서 0의값이 들어가기때문에 

뒤에 있는값을 가져와서 사용해야합니다.

 

그후 기존의 배열의 길이가 1인 경우는 배열의 초기화를 이용하여 new int[] {-1}을 사용합니다.

 

배열의 이해를 돕기위해 사진 첨부합니다. 이부분을 이해해야 문제가 풀립니다....!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!으아!!!!!!!!!!!!!

배열은 인덱스로 값을 앞으로 땡기거나 할수있습니다. 

 

 

 

* 코드 해설 *

 

정수 배열의 길이를 새로운 배열인 answer에 -1한만큼 저장합니다.

저장이 끝난후 최소값 및 최소값 인덱스를 구합니다.

최소값은 0번째 배열에서 계속 비교하면서 작은값을 대입시킵니다.

"min = arr[0] "

for문에 int i = 1를 준 이유는 현재 min의 값에 0번째 배열의 값이 들어가있기에

똑같은 값을 비교하면 값은 같기에 1부터 시작했습니다.

 

min의값에 따라서 minIndex(최소값 인덱스)를 찾았습니다.

이제 이 최소값 인덱스를 통해 가장작은값을 제거할겁니다.

 

for문의 조건은 arr.length - 1를 준 이유는 현재 answer[]배열은 3의 길이를 가지고있기에

3의 길이에 맞추기 위해 -1의 값을 넣었습니다.

 

그후 minIndex의 값은 현재 정수배열의 가장 작은 최소값이며 인덱스값입니다.

그리고 만약에 minIndex의값이 현재 i의값보다 작은경우 answer[]의 값에 arr[i]의 배열의 값을 넣습니다.

하지만 저희는 작은 수를 제거했기에 기존 arr[i]배열에는 값이 하나가 빈상태입니다.

빈상태인경우에 배열의 길이 오류가 납니다.

그리고 i < minIndex의 조건이 부합되지않기에 else문을 통하여 현재 인덱스의 값을 대체할만한 인덱스를 찾아야합니다.

{4,3,2,1}배열 처럼 나열이되어있다면 마지막값인 1을 제외하고 들어가게됩니다.

하지만 {4,1,2,3}인경우는 두번쨰 인덱스에서 가장최소값을 제외한다면 1인덱스의 배열의 값이 들어가지 않기에 arr[i]의 배열에 저장을 못하게됩니다.

그런경우 arr[i]의 배열의 그다음 인덱스를 집어넣어줍니다. 

answer[i] =  arr[i + 1];

이렇게 되면 최소값의 인덱스를 제외하고 그다음 인덱스가 들어가게되어 answer[i]의 배열의 길이에 0이값이들어가지않아 문제는 풀립니다.

 

문제 이해 사진 첨부 

 

 

 

 

 

 

더좋은 소스있으면 공유바랍니다.

 

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

Comments