<문제 제시>
<문제설명>
정수 배열 array와 정수 n이 매개변수로 주어질 때,
array에 들어있는 정수 중 n과 가장 가까운 수를
return 하도록 solution 함수를 완성해주세요.
<예시 입출력>
<문제 해결 과정>
가까운 수라는 개념을 어떻게 구현해야할지 먼저 생각해보아야했다.
앞 뒤 값으로 n값과의 차이가 가장 적은 것을 구해야했다.
Try 1)
int answer = 0;
// 초기값은 배열의 첫번째값 차이로 설정
int diff = Math.abs(array[0] - n);
int target = 0;
for(int i = 0; i < array.length; i++) {
if(diff > Math.abs(array[i] - n)){
diff = Math.abs(array[i] - n);
target = array[i];
}
}
answer = target;
return answer;
diff (차이) 변수를 두어 Math.abs로 배열의 첫값과 n의 차이를 절대값으로 매겨 저장한다.
그 이후 값들의 절대값(차이)가 diff 보다 작게되면 diff를 업데이트해주고, target 수를 바꿔주는 로직이었다.
하지만 몇몇 테스트케이스를 통과하지는 못하였다.
Solution 1)
n보다 큰 값이 없을 경우 예외처리를 해주어야할 것 같았다.
for(int i = 0; i < array.length; i++) {
// n보다 작은경우 인덱스를 증가시켜 다음단계로
if(array[i] <= n) {
continue;
}
else {
int pre = n - array[i - 1];
int post = array[i] - n;
if(pre > post) {
// 가까운 수를 찾는 것이므로 pre(이전)값이 아닌 현재 값을 리턴
answer = array[i];
return answer;
}
else if(pre < post) {
answer = array[i-1];
return answer;
}
// 가까운수가 여러개일 경우 예외처리
// >> '더 작은 수를 리턴'
else if(pre == post) {
answer = array[i-1];
return answer;
}
}
}
조건문을 통해 배열 값이 n보다 작거나 같을 경우에는 반복문을 진행시키고,
아닐 경우
pre, post 변수를 두어 pre 에서는 n - 배열의이전값 을 저장하고,
post에서는 현재배열값 - n을 저장한다.
pre와 post의 값 대소비교를 통해 answer에 값을 업데이트 한다.
정리해보자면)
1) n보다 큰 값이 없을 경우 배열의 맨 뒤값을 리턴한다.
2) 가까운수가 여러개일 경우 예외처리도 해주어야한다. = 더 작은 수를 리턴
3) 먼저 배열을 정리해준 후 n의 위치를 어림잡는다.
<전체코드>
import java.util.Arrays;
public class near_num {
public static int solution(int[] array, int n) {
int answer = 0;
Arrays.sort(array);
for(int i = 0; i < array.length; i++) {
// n보다 작은경우 인덱스를 증가시켜 다음단계로
if(array[i] <= n) {
continue;
}
else {
int pre = n - array[i - 1];
int post = array[i] - n;
if(pre > post) {
// 가까운 수를 찾는 것이므로 pre(이전)값이 아닌 현재 값을 리턴
answer = array[i];
return answer;
}
else if(pre < post) {
answer = array[i-1];
return answer;
}
// 가까운수가 여러개일 경우 예외처리
// >> '더 작은 수를 리턴'
else if(pre == post) {
answer = array[i-1];
return answer;
}
}
}
// 조건에 모두 부합하지 않는 예외일 경우는 배열의 맨 끝값을 리턴
answer = array[array.length - 1];
return answer;
}
public static void main(String[] args) {
int[] array = {10, 11, 12};
int n = 13;
System.out.println(solution(array, n));
}
}
pre와 post변수를 따로 두어 가까운 수를 찾는 과정을 통해 다른 근접값을 구하는 알고리즘 문제에 활용할 수 있을 것 같았다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120890
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '한 번만 등장한 문자' - Java (0) | 2023.05.12 |
---|---|
[프로그래머스] '캐릭터의 좌표' - Java (0) | 2023.05.12 |
[프로그래머스] '중복된 문자 제거' - Java (0) | 2023.05.11 |
[프로그래머스] '소인수분해' - Java (0) | 2023.05.10 |
[프로그래머스] '숨어있는 숫자의 덧셈 (1)' - Java (0) | 2023.05.10 |