[프로그래머스/Java] Lv.0 가까운 수

febCho·2024년 4월 20일
0

코딩테스트

목록 보기
177/253
post-thumbnail

문제

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

- 제한사항

  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

풀이

오답 기록을 못했는데, 처음 제출 시에는 가장 가까운 수가 여러 개일 경우 더 작은 수를 return하라는 제한사항을 간과해 72. 몇 점을 맞게 되었다. 그래서 해당 조건을 추가하기 위해 가변적으로 길이를 늘릴 수 있는 List 객체를 활용하기로 했다.

우선 배열 array에 담긴 수 중 n에 더 가까운, 즉 뺐을 때 절댓값이 가장 작은 수를 구하기 위해 Math.abs()를 사용했다. 그렇게 구한 값 diff를 최댓값, 최솟값 구하는 문제처럼 임의의 값 temp와 비교해 더 작을 경우 temp에 대입해 (temp로 교체해) 주었다.

문제는 그런 temp와 diff가 같은 경우에 대한 처리를 해주어야 한다는 것이다. 예를 들어 주어진 수 n이 10인데, 5와 15가 array에 있다면? 이를 해결하기 위해 if문으로 경우의 수를 나누어 주었고, diff가 확실히 작다면 temp 값을 교체해 준 뒤 clear() 메서드로 list 객체를 비우고 add()로 그에 해당하는 값을 저장해 주었다.

값이 같을 경우 lsit에 같은 차이값을 가지는 요소들을 저장해 주면 되겠다는 생각은 들었는데, 그럼 확실하게 작은 경우엔 어떻게 해주어야 하지 고민이 되었다. 그러다 생각난 메서드가 바로 clear(). 더 가까운 원소들이 몇 개가 담겼건 간에 다 비우고 대체! 그리고 값이 같을 경우엔 차이값이 같기 때문에 temp = diff;를 수행할 필요는 없고 그냥 add()로 list에 담으면 된다.

마지막으로 그중 가까운 수를 찾기 위해 Math.min()으로 루프를 돌며 더 작은 수를 담아 반환했다. 가장 가까운 수가 여러 개라고 해봤자 2개겠지만, 길이가 2인 배열을 사용하면 값이 하나일 경우 0으로 초기화된 인덱스의 값과 비교하기가 더 힘들 것 같아서 그냥 List로 했다. 가변 길이 만세!

import java.util.List;
import java.util.ArrayList;

class Solution {
    public int solution(int[] array, int n) {
        int temp = Integer.MAX_VALUE;
        List<Integer> list = new ArrayList<>();
        
        for(int i=0; i<array.length; i++){
            int diff = Math.abs(n - array[i]);
                        
            if(temp > diff){
                temp = diff;
                list.clear();
                list.add(array[i]);
            }else if(temp == diff){
                list.add(array[i]);
            }
        }
        
        int small = Integer.MAX_VALUE;
        for(int a : list){
            small = Math.min(small, a);
        }
        
        return small;
    }
}

결과

profile
Done is better than perfect.

0개의 댓글