새소식

Programmers Coding Test/Java

[프로그래머스 120890] Java - 코딩테스트 입문 / 가까운 수

  • -

 

 

가까운 수

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/120890

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1)  문제

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ array의 길이 ≤ 100
1 ≤ array의 원소 ≤ 100
1 ≤ n ≤ 100
가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

 

 

2)  예시

 

 

Result Table
array n result
[3, 10, 28] 20 28
[10, 11, 12] 13 12

 

 

 

입출력 예 #1
3, 10, 28 중 20과 가장 가까운 수는 28입니다.


입출력 예 #2
10, 11, 12 중 13과 가장 가까운 수는 12입니다.

 

 

 

 

 

 

3)  풀이

 

※ Math.abs()란?

주어진 숫자의 절댓값을 반환하는 메소드입니다. 양수면 그대로, 음수면 양수로 변환합니다.

 

 

 

1. 클래스 선언을 해줍니다

● class Solution {

클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.

 

 

 

 

2. 정수배열 array와 정수 n을 매개변수로 하는 solution 메소드를 선언합니다.

solution은 정수를 반환하므로 데이터타입을 int로 합니다.

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

 

 

 

 

3. 제한사항을 확인하고, 만족하지 않을 경우 예외처리합니다.

●    if (array.length < 1 || array.length > 100 || n < 1 || n > 100) {
            throw new IllegalArgumentException("제한사항을 확인하세요");
        }
    

 

 

 

4. 가장 가까운 값을 closest로 선언하고 array[0]값으로 할당합니다.

    최소 차이값을 minDiff로 선언하고, 초기값으로 array[0] - n으로 할당합니다.

   (n과의 가장 가까우려면 차이가 가장 작아야겠죠)

●    int closest = array[0];
      int minDiff = Math.abs(array[0] - n);


 

 

 

 

5. array 배열을 순회하며 차이값 diff를 구합니다.

만약 diff값이 minDiff보다 작다면 그게 minDiff값으로 변하게하고,

그 때의 array[i]를 closest가 되게합니다.

 

하지만 만약 minDiff값이 여러개이고, i번째 원소가 closest보다 작을 경우,

그 i번째 원소가 cloeset가 됩니다.

즉, 가장 가까운 수가 여러개일 경우 가장 작은 값을 반환합니다.

●   for (int i = 0; i < array.length; i++) {
            int num = array[i];
            int diff = Math.abs(num - n);

            if (diff < minDiff) {
                minDiff = diff;
                closest = num;
            } else if (diff == minDiff && num < closest) {
                closest = num;
            }
        }

        return closest;
    }
}

 

 

 

 

 

 

 

4)  코드

 

class Solution {
    public int solution(int[] array, int n) {
        if (array.length < 1 || array.length > 100 || n < 1 || n > 100) {
            throw new IllegalArgumentException("제한사항을 확인하세요");
        }
        
        int closest = array[0];
        int minDiff = Math.abs(array[0] - n);

          for (int i = 0; i < array.length; i++) {
            int num = array[i];
            int diff = Math.abs(num - n);


            if (diff < minDiff) {
                minDiff = diff;
                closest = num;
            } else if (diff == minDiff && num < closest) {
                closest = num;
            }
        }

        return closest;
    }
}

 

 

 

 

 

 

 

5)  느낀점

 

n의 양옆의 차이를 구해야하고 그 크기를 비교해야하기 때문에 Math.abs로 절대값을 이용해야한다는 사실을 알았습니다.  } else if (diff == minDiff && num < closest) {

이 부분의 조건식에서 num < closest 부분이 굉장히 헷갈려서 많은 시간이 소요됬던 것 같습니다.

num > closest했다가 다시 바꿨다가 여러번 반복하다가 다시 이해가 되서 원래대로 돌렸습니다.

 

어찌보면 가장 큰수와 그 인덱스를 반환하는 것도 비슷하면서도 다른 문제

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.