-
[JAVA] 프로그래머스 제일 작은 수 제거Algorithm 2022. 1. 30. 13:04
- 제일 작은 수 제거하기
문제 설명정수를 저장한 배열, arr에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를 들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴하고, [10] 면 [-1]을 리턴합니다.
제한 조건- arr은 길이 1 이상인 배열입니다.
- 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
[4,3,2,1] [4,3,2] [10] [-1] public class 제일작은수제거 { public static void main(String[] args) { int[] data = {4,3,2,1}; int[] data3 = {6,5,4,1,2,8}; int[] data2 = {10}; System.out.println(solution(data3).length); } public static int[] solution(int[] arr){ int min = arr[0]; int minIndex = 0; for(int i = 0; i < arr.length; i++){ if(arr[i] < min){ min = arr[i]; minIndex = i; } } int[] destination = new int[arr.length - 1]; int remainingElements = arr.length - (minIndex + 1); System.arraycopy(arr, 0, destination, 0, minIndex); System.arraycopy(arr, minIndex + 1, destination, minIndex, remainingElements); if(arr.length == 1){ return new int[]{-1}; } System.out.println(Arrays.toString(destination)); return destination; } }
안녕하세요~~~ 이번 포스팅인 프로그래머스 LV1 문제인 배열에서 제일 작은 수를 제거하는 문제를 알아보겠습니다.
이번 문제는 해결하는데 시간이 꽤 걸렸습니다 ㅠㅠㅠㅠ
배열은 자바 컬렉션인 ArrayList 혹은 자바스크립트 배열을 많이 사용을 하다 보니까 동적으로 컨트롤 하기가 간단하죠
원하는 데이터의 특정 index를 찾을 수도 있고 배열의 길이는 가변적이며. add,. push,. splice,. pop 등의 메서드를 통해서 배열을 컨트롤 하기 굉장히 수월합니다.
하지만 자바 배열은 정적이기 때문에 불가변적이며 배열 탐색, 데이터의 수정 등이 쉽지가 않았습니다.
그래서 Googling을 통해서 배열에 관한 메서드를 많이 찾아봤네요 ㅠㅠ.
우선, 이번 문제는 논리는 굉장히 간단합니다. 배열 안에 제일 작은 숫자를 제거해서 나머지 데이터를 가진 배열만 return 하면 되고 데이터가 1개라서 제일 작은 숫자를 찾을 수 없을 때는 -1이라는 데이터를 가진 배열을 return 하면 됩니다.
우선 테스트를 위해 main 메서드에다가 몇 개의 데이터를 넣었습니다.
일단 이 문제를 해결하기 위해서는 배열 안의 가장 작은 수를 찾아야 하고 그 수가 가지고 있는 index를 찾아내는 게 첫 번째 핵심입니다.
그러기 위해서는 배열을 반복문을 돌려서 가장 작은 수와 가장 작은 수가 가진 index를 찾아서 min이라는 변수와 minIndex라는 변수에 넣어줍니다.
사실 가장 작은 수를 찾을 필요는 없지만 가장 작은 수의 index를 찾기 위해서는 작은 수를 찾아 데이터를 비교를 해줘야 합니다.
여기까지 됐다면 이제 새로운 배열을 하나 생성해줘야 하는데 parameter로 넘어온 배열의 길이보다 1 작은 length로
잡아줍니다.
왜냐면 저희가 원하는 것은 가장 작은 수를 제거한 나머지를 반환하는 것이기 때문에 길이는 항상 -1 이여야 합니다!!
그러고 나서 remainingElements의 개수를 구해줍니다!!!! 말 그대로 남아있는 요소들입니다
만약 [6,5,1,3,4]라는 배열이 있다면 1이 가장 작은 수이고 1이 가진 index는 2입니다.
그렇다면 제가 할 것은 1이라는 숫자를 기준으로 앞 뒤로 잘라서 붙인다는 것입니다.
배열을 자를 때는 시작 인덱스와 자를 개수를 선택해야 하는데 자를 개수를 선택할 때 remainingElements가 필요합니다.
앞의 6,5를 자르고 나서 1 뒤의 3,4를 자를 때는 해당 개수만큼만 잘라야 하기 때문입니다.
arr.length - ( minIndex + 1)를 통해서 배열 안의 남아있는 요소의 개수를 구할 수 있습니다.
그러고 나서는 저도 처음 봤던 메서드인 System.arraycopy라는 메서드를 사용했습니다!
말 그대로 배열을 복사하는 메서드인데요
파라미터는 (원본 배열, 시작 인덱스, 이동할 배열, 시작 인덱스, 개수) 이렇게 생각하면 될 것 같습니다.
예제)
arr = {6, 5, 4, 1, 2, 8} //길이가 6인 데이터가 담긴 배열
destination = [5] //길이가 5인 데이터가 없는 배열
이렇게 길이가 6인 배열이 있다고 가정합시다. 가장 작은 수는 1이고 1의 인덱스는 3입니다.
그럼 remainingElements는 2입니다. (뒤의 2와 8)
그리고 destination이라는 길이가 1 작은 배열을 선언해줍니다. 원래의 배열에 있는 데이터가 복사될 새로운 배열입니다.
그리고 arraycopy메서드를 통해서 원래의 배열 0번째 인덱스부터 minIndex인 3만큼 자릅니다.
그렇다면 destination 배열에는 [6, 5, 4, 0, 0]이라는 수가 들어가게 됩니다.
자바 배열은 크기를 선언을 해 놓고 초기화를 안 하면은 0 이라는 default number가 들어가게 됩니다.
무튼 그러고 나서 다시 한번 arraycopy를 통해 배열을 자릅니다.
시작 index는 가장 작은 수의 index 다음부터 잘라야 하니까 minIndex + 1부터 remaingElements의 개수인 2개만 잘라서 destination의 minIndex부터 넣어 줍니다.
Arr 6 5 4 1(가장 작은 수) 2 8 Destination 6 5 4 2 8 Index 0 1 2 3 4 5 Bold 처리된 부분이 index입니다.
가작 작은 수의 뒤에 있는 4번째 인덱스로부터 2개의 데이터를 destination의 3번째 인덱스부터 복사를 하는 것입니다.
그리고 마지막으로는 넘의 온 배열의 길이가 1이라면 바로 배열을 생성해서
return new int []{-1}이렇게 return을 해줬습니다.
아래는 문제 해결을 하면서 테스트했던 데이터와 결과입니다.
'Algorithm' 카테고리의 다른 글
[JAVA] 프로그래머스 이상한 문자 만들기! (0) 2022.02.01 [JAVA] 프로그래머스 x만큼 간격이 있는 숫자 (0) 2022.01.31 [JAVA] 프로그래머스 lv1 내적 (0) 2022.01.29 [JAVA] 프로그래머스 하샤드 수 구하기 (0) 2022.01.29 [JAVA] 프로그래머스 lv1 완주 하지 못한 선수 (0) 2022.01.28