
안녕하세요!
오늘은 5월 3주차 5번째 알고리즘인 Minimum Moves to Equal Array Elements II 풀이를 작성해보도록 하겠습니다.

요약
주어진 nums 배열에서 해당 숫자들을 동일한 숫자로 만들어야합니다. 그 과정에서 가장 적은 횟수를 return하는 문제입니다.
우선,
nums배열을 오름차순으로 정렬한 후에min값과max값 사이 값을 찾아서 횟수를 세주었습니다.
그런데 이 방법이 틀린건지 로직이 틀렸다고 나오더라고요..
그렇다면 가장 최소로 움직여야하니까, 중간 인덱스에 위치한 숫자를 기준으로 횟수를 세주는 방법은 어떨까라는 생각을 했습니다.
아무래도min과max의 중간 값은 배열에 없는 값일 수도 있지만, 중간 인덱스에 있는 값은 배열에 있는 값이기 때문에 적어도 하나의 숫자는 변화를 주지 않아도 되기 때문입니다.
그래서length/2인덱스를 기준삼아서 횟수를 셌고, Accept를 받았습니다.
int result = 0;
Arrays.sort(nums);
int standardNum = nums[nums.length / 2];
결과값을 도출할 result 를 선언합니다.
그리고 배열을 정렬한 후에 기준값을 중간 인덱스의 값으로 설정합니다.
for (int num: nums) {
result += Math.abs(num - standardNum);
}
그리고 for문을 순회하면서 result 에 num 에서 기준값을 뺀 결과를 절대값으로 더해주면 끝입니다!
여태까지의 문제중에 가장 짧은 코드가 아닐까 생각합니다..
class Solution {
public int minMoves2(int[] nums) {
int result = 0;
Arrays.sort(nums);
int standardNum = nums[nums.length / 2];
for (int num: nums) {
result += Math.abs(num - standardNum);
}
return result;
}
}
되게 쉽게 풀었는데, 제가 알고리즘을 조금 늦게 풀었더니 문제는 맞췄지만 챌린지는 실패했습니다.. 슬프네요..
이번 포스팅도 읽어주셔서 감사합니다! 질문이나 피드백 모두 환영이에요 :)