본문 바로가기

프로그래머스 코딩(자바)/Level 0

Programmers Level 0 - 가까운 수

728x90

문제 설명

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

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

 

입출력 예

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입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Arrays;
class Solution {
    public int solution(int[] array, int n) {
        int answer = 0;
        int min = 101;
        Arrays.sort(array);
        for(int i=array.length-1;i>=0;i--) {
            if(min >= Math.abs(n-array[i])) {
                answer = array[i];
                min = Math.abs(n-array[i]);
            }
        }
        return answer;
    }
}

 

 

  이 문제는 n값을 빼주었을때 절대 값의 최소값을 구하는 문제이다.
  
 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다. 조건 때문에 정렬하고 뒤에서 부터 구해야 한다.

 Math.abs() 메서드는 절대값을 구해준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
class Solution {
    public int solution(int[] array, int n) {
        int min = Arrays.stream(array).map(v -> Math.abs(v - n)).min().orElse(0);
        List<Integer> list = Arrays.stream(array).map(v -> Math.abs(v - n)).boxed().collect(Collectors.toList());
        int index1 = list.indexOf(min);
        int index2 = list.lastIndexOf(min);
        return Math.min(array[index1], array[index2]);
    }
}


 

 

  리스트로 만들고 절대 값이 제일 적은 값을 찾는다.
  int min = Arrays.stream(array).map(v -> Math.abs(v - n)).min().orElse(0);

  절대값들의 리스트를 만든다.
  List<Integer> list = Arrays.stream(array).map(v -> Math.abs(v - n)).boxed().collect(Collectors.toList());
  
  절대값이 같은 값은 많아야 두개 밖에 없다.

  그래서 리스트의 앞에서  부터 indexOf()로 위치를 찾고
   int index1 = list.indexOf(min);

  리스트의 뒤에서 부터 lastIndexOf()로 위치를 찾는다.
   int index2 =list.lastIndexOf(min);

   배열에서 두개 위치의  값을   비교하여 적은 값을 가지면 된다.
    return Math.min(array[index1], array[index2]);

 

728x90