개발자는 기록이 답이다

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

알고리즘/프로그래머스

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

slow-walker 2023. 8. 25. 03:50

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

 

프로그래머스

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

programmers.co.kr

 

내가 푼 풀이

- 정렬은 성능을 저하시켜서, 사용하지 않기 위해 최솟값을 2번 활용했습니다.

- 대신 정렬을 안써서 30ms정도 속도를 줄일 수 있었습니다.

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

        int absMin = 100; // 절대값 최소값 구하기 위한 초기화
        int numMin = 100; // 최소값 구하기 위한 초기화

        // 절대값 최솟값 찾기
        for (int i = 0; i < array.length; i++) {
            int temp = Math.abs(n - array[i]);
            if (absMin >= temp) {
                absMin = temp;
            }
        }
        // 절대값 최소값과 같은 절대값을 가지면서 더 작은 숫자 찾기
        for (int findNum : array) {
            int abs = Math.abs(n - findNum);
            if (absMin == abs && numMin > findNum) {
                numMin = findNum;
            }
        }
        return numMin;
    }
}
테스트 1 통과 (0.09ms, 75.1MB)
테스트 2 통과 (0.03ms, 75.8MB)
테스트 3 통과 (0.04ms, 74.1MB)
테스트 4 통과 (0.02ms, 76.9MB)
테스트 5 통과 (0.03ms, 78.1MB)
테스트 6 통과 (0.04ms, 77.3MB)
테스트 7 통과 (0.03ms, 73MB)
테스트 8 통과 (0.03ms, 75.8MB)
테스트 9 통과 (0.03ms, 72.1MB)
테스트 10 통과 (0.03ms, 73.2MB)
테스트 11 통과 (0.03ms, 76MB)
테스트 12 통과 (0.03ms, 75.1MB)
테스트 13 통과 (0.02ms, 75MB)
테스트 14 통과 (0.03ms, 83.4MB)
테스트 15 통과 (0.03ms, 76.4MB)
테스트 16 통과 (0.03ms, 70.1MB)
테스트 17 통과 (0.03ms, 73.2MB)
테스트 18 통과 (0.02ms, 77MB)

 

 

다른 사람 풀이 1

- 정렬과 최솟값을 사용해서 푼 방식입니다.

- 확실히 정렬을 한다고 하니까 가독성이 더 좋은 것 같습니다.

import java.util.*;

class Solution {
    public int solution(int[] array, int n) {
        int answer = 0;
        Arrays.sort(array);
        for(int i = 1 ; i < array.length ; i++){
            if(Math.abs(n-array[0]) > Math.abs(n-array[i])){
                array[0] = array[i];
            }
        }
        answer = array[0];
        return answer;
    }
}
테스트 1 통과 (0.47ms, 71MB)
테스트 2 통과 (0.53ms, 79.2MB)
테스트 3 통과 (0.47ms, 76.5MB)
테스트 4 통과 (0.54ms, 75.2MB)
테스트 5 통과 (0.34ms, 73MB)
테스트 6 통과 (0.40ms, 69.9MB)
테스트 7 통과 (0.41ms, 72.3MB)
테스트 8 통과 (0.36ms, 71.1MB)
테스트 9 통과 (0.45ms, 75.9MB)
테스트 10 통과 (0.34ms, 72.6MB)
테스트 11 통과 (0.36ms, 76.1MB)
테스트 12 통과 (0.52ms, 76.7MB)
테스트 13 통과 (0.49ms, 90.4MB)
테스트 14 통과 (0.32ms, 67.1MB)
테스트 15 통과 (0.36ms, 80.5MB)
테스트 16 통과 (0.31ms, 69.7MB)
테스트 17 통과 (0.30ms, 72.5MB)
테스트 18 통과 (0.34ms, 75.3MB)

 

 

다른 사람 풀이 2

- 스트림으로 푼건데, 언젠가 스트림은 공부하긴 하겠지만.. 성능도 for문보다 낮은데 왜 스트림을 쓰는지 이해 못하겠습니다.

import java.util.Arrays;
import java.util.stream.Collectors;

class Solution {
    public int solution(int[] array, int n) {
        return Math.min(array[Arrays.stream(array).map(operand -> Math.abs(n - operand)).boxed().collect(Collectors.toList()).indexOf(Arrays.stream(array).map(operand -> Math.abs(n - operand)).min().orElse(0))], array[Arrays.stream(array).map(operand -> Math.abs(n - operand)).boxed().collect(Collectors.toList()).lastIndexOf(Arrays.stream(array).map(operand -> Math.abs(n - operand)).min().orElse(0))]);
    }
}
테스트 1 통과 (5.51ms, 77.2MB)
테스트 2 통과 (4.31ms, 71.5MB)
테스트 3 통과 (7.00ms, 75.1MB)
테스트 4 통과 (6.28ms, 77.2MB)
테스트 5 통과 (4.55ms, 75.1MB)
테스트 6 통과 (5.28ms, 78.4MB)
테스트 7 통과 (3.09ms, 74.8MB)
테스트 8 통과 (4.74ms, 79.2MB)
테스트 9 통과 (4.52ms, 82.2MB)
테스트 10 통과 (3.06ms, 77.4MB)
테스트 11 통과 (3.19ms, 76.7MB)
테스트 12 통과 (3.11ms, 77.4MB)
테스트 13 통과 (4.48ms, 77.6MB)
테스트 14 통과 (4.15ms, 78.2MB)
테스트 15 통과 (3.75ms, 70.1MB)
테스트 16 통과 (4.28ms, 77.8MB)
테스트 17 통과 (3.51ms, 73.9MB)
테스트 18 통과 (3.11ms, 76.2MB)