티스토리 뷰

1Day 1Algorithm

[DAY 9] Max Min

walk_through_me 2019. 10. 9. 15:45

You will be given a list of integers, arr, and a single integer k. You must create an array of length k from elements of arr such that its unfairness is minimized. Call that array subarr. Unfairness of an array is calculated as

 

max(subarr) - min(subarr)

 

Where:
- max denotes the largest integer in subarr.
- min denotes the smallest integer in subarr. 

As an example, consider the array [1, 4, 7, 2] with a k of 2. Pick any two elements, test subarr = [4, 7].
unfairness = max(4, 7) - min(4, 7) = 7 - 4 = 3
Testing for all pairs, the solution [1, 2] provides the minimum unfairness.

Note: Integers in arr may not be unique.

 

 

Max Min | HackerRank

Given a list of N integers, your task is to select K integers from the list such that its unfairness is minimized.

www.hackerrank.com

 

풀이

function maxMin(k, arr) {
    let minUnfairness = Number.MAX_SAFE_INTEGER;
    arr.sort((a, b) => a - b);
    for(let i = 0; i < arr.length; i++) {
        let unfairness = arr[i+k-1] - arr[i];
        if(unfairness === 0) {
            minUnfairness = 0;
            break;
        }
        if(minUnfairness > unfairness) {
            minUnfairness = unfairness;
        }
    }
    return minUnfairness;
};

1. 최소차이값을 넣어줄 변수 minUnfairness를 선언하고, 가장 큰 (안전한) 정수를 넣어줌.

2. arr를 정렬함(arr에서 임의의 수 k개를 뽑는 거지만, 숫자가 작을 수록 차도 작을 가능성이 크니까)

3. for문으로 k개의 수 중 가장 큰 값과 현재값을 빼주고 unfairness 변수에 담음(정렬되어 있으니 당연히 제일 큰 값이 arr[i+k-1]겠져)

4. 만약에 unfairness가 0이면 당연히 젤 작을테니 for문을 끝내고 minUnfairness를 0으로 반환하며 턴을 마침

5. 만약 unfairness가 현재 가장 최소차이 값인 minUnfairness보다 작다면, minUnfairness 값을 unfairness로 갱신해줌

6. minUnfairness를 반환함

 

테스트 케이스를 모두 통과했는데 14번만 자꾸 실패가 뜨는 것은 해커랭크의 문제인것인가. Success라매요

 

 

다른 사람의 풀이

function maxMin(k, arr) {
    arr = arr.sort(function (a, b) {
        return a - b;
    });
    var resultArr = []
    for (var i = 0; i + k <= arr.length; i++) {
        var max = arr[i + k - 1];
        var min = arr[i];
        resultArr.push(max - min);
    }
    var min = resultArr.reduce(function (a, b) {
        return Math.min(a, b);
    });
    return min;
};

정렬까지는 나랑 똑같은데, 결과 배열을 생성해서 차이 값을 모두 새로운 배열에 넣어줌. 그리고 나서 최소값을 reduce를 이용해 뽑아냈음.

 

reduce를 쓰지않고 Math.min을 이용해서 아래처럼 쓰면 더 간단할거같음!

Math.min.apply(null, resultArr);

'1Day 1Algorithm' 카테고리의 다른 글

[DAY 11] Jim and the Orders  (0) 2019.10.12
[DAY 10] Balanced Brackets @  (0) 2019.10.10
[DAY 8] Greedy Florist  (0) 2019.10.08
[DAY 7] A Very Big Sum  (0) 2019.10.07
[DAY 6] Recursion: Fibonacci Numbers  (0) 2019.10.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함