땃쥐네

[Programmers] [120890] 가까운 수 본문

Algorithm/Programmers

[Programmers] [120890] 가까운 수

ttasjwi 2023. 1. 18. 13:15

문제

  • 번호 : 120890
  • 제목 : 가까운 수
  • 난이도 : Level 0
  • array에 들어있는 정수 중 n과 가장 가까운 수를 return
  • 문제 : 링크

필요 알고리즘

  • 최솟값 알고리즘
  • 정렬 기준 구현

Python

def solution(array, n):
    return min(array, key=lambda x: (abs(n-x), x-n))
  • min 함수를 통해 다음 기준에 따른 최솟값을 구한다.
    • 첫번째 정렬 기준 : n과 x의 차의 최솟값
    • 두번째 정렬 기준 : x-n (차가 같을 경우 x-n 값이 작을 수록 더 작다)
  • 속도 : 0.00ms ~ 0.02ms
  • 파이썬에서는 숫자도 객체이고, 편리한 기본 함수들이 많이 제공되기 때문에 이런 간결한 코드 작성이 매우 쉽다.

Java

풀이1 : Stream 사용

import java.util.Arrays;
import java.util.Comparator;

public class Solution1 {

    public int solution(int[] array, int n) {
        return Arrays.stream(array)
                .mapToObj(Integer::valueOf)
                .min(Comparator.comparing(x-> Math.abs(n - (int) x)).thenComparing(x-> (int) x-n))
                .get();
    }
}
  • 배열을 스트림으로 변환 후, 박싱한다.
  • 이하의 정렬기준에 따라 최솟값을 구한다.
    • 첫번째 정렬 기준 : n과 x의 차의 최솟값
    • 두번째 정렬 기준 : x-n (차가 같을 경우 x-n 값이 작을 수록 더 작다)
  • 이렇게 구한 값을 다시 언박싱(이 코드에서는 오토 언박싱이 됐다.)하여 반환한다.
  • 속도 : 3.62ms ~ 19.26ms (당연히 Stream을 쓰므로 매우 느리다. 하지만 통과는 된다.)

풀이2 : 반복문을 통한 갱신

public class Solution2 {

    public int solution(int[] array, int n) {

        int diff;
        int minDiff = Integer.MAX_VALUE;
        int answer = -1;

        for (int i : array) {
            diff = Math.abs(n - i);

            if (minDiff > diff) {
                minDiff = diff;
                answer = i;
            } else if (minDiff == diff) {
                if (answer > i) {
                    answer = i;
                }
            }
        }

        return answer;
    }
}
  • diff : 차
  • minDiff : 최소 차
  • answer : 정답
  • 배열을 순회하며 다음을 반복한다.
    • 최소차 갱신 : 더 작은 차가 발생하면, 해당 숫자로 answer를 갱신하고 최소차를 갱신한다.
    • 최소차와 같은 차가 등장했을 때 : 더 작은 숫자로 answer를 갱신한다.
  • 마지막에 answer를 반환한다.
  • java 기준 이 방식이 제일 빠르다.
  • 속도 : 0.02ms ~ 0.10ms

후기

같은 코드를 파이썬에서는 한 줄로 할 수 있는데, 자바는 여러 줄을 짜야한다...

 

알고리즘 대회를 준비한다면 속도 관점에서 유리한 C++ 과 같은 언어를 사용하여 좀 더 세밀하게 최적화를 할 수 있겠지만,

 

 

코딩테스트를 준비하는 관점이라면 통과만 된다면 간결하게 코드를 짜는게 낫지 않나 싶다. 취업을 준비하는 관점에서 놓고 보면 다양한 언어를 알고 있다면, 그 문제를 통과시키는데 더 빠르고 편한 언어를 선택하는 역량도 중요한 것 같다.

 

실무에서도, 같은 기능을 개발하더라도 좀 더 간결한 코드로 빨리 작성할 수 있다면 성능 상에서는 손해를 볼 수 있어도 개발 시간이 단축되고 사용자에게 빠르게 첫 제품을 선보여서 피드백을 빨리 얻을 수 있다. 결국 모든 것은 트레이드 오프다.

 


 

Comments