알고리즘 테스트# 8. 제일 작은 수 구하기
안녕하세요.
프로그래머스에 있는 "제일 작은 수 구하기" 알고리즘 문제를 풀어보겠습니다.
문제 : 정수를 저장한 배열, 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