Bleeding edge

[LeetCode] 2293. Min Max Game - 자바스크립트 0610 본문

코딩테스트 공부

[LeetCode] 2293. Min Max Game - 자바스크립트 0610

codevil 2022. 6. 10. 11:37

https://leetcode.com/problems/min-max-game/

 

Min Max Game - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

처음에 억.. 어떻게하지? 하고 단순한데 뭔가 짜야할 방향이 보이지 않아 순간 멘붕을 했었다. 하지만, 차분하게 문제를 보니 문제를 푸는 방법이 생각났다. 

1. nums의 length가 1이 나올 때까지 계속 내용물을 줄여야했다.

2. 내용물을 줄이는 loop문은 두가지가 존재해야했다. 

  2-1 index 0부터 끝까지, min, max, min, max 순으로 계산하되, index의 두개의 값은 1개로 바꾸어주는 loop

  (2-1에대한 설명이 너무 복잡해서 추가 설명을 더 하자면, [1,2,3,4]가 있다고하면 1,2를 1로, 3,4를 4로 바꾸어서 [1,4]로 바꾸어주는 루프를 이야기한 것이다)

  2-2 2-1을 1번처럼 length가 1이 될때까지 계속 루프를 돌려주는 루프

우선 while문으로 먼저 시작했다.

    while (nums.length !== 1) {
    
    }

while문을 넣으면 [3]과 같은 Boudnary Condition이 모두 해결된다.

1. 그리고, for 문을 넣는다. for 문은 nums의 index에 따라서, 1개씩 증가한다.

2. 그리고 min, max 순환을 위해서, checker = true라는 변수를 만든다. (다음번에는 isMin 이라는 변수를 사용해야겠다)

        let checker = true
        for (let i = 0; i < nums.length; i++) {
        
        }

이때 loop문에 필요한 변수가 하나 더 필요하기에

1. calc라는 변수를 만들고, 

2. checker의 값에 따라서 min 혹은 max를 넣고 calc를 계산한다.

3.그리고 checker 값을 바꾸어준다

        for (let i = 0; i < nums.length; i++) {
            let calc
            if (checker === true) {
                calc = Math.min(nums[i], nums[i + 1])
            } else {
                calc = Math.max(nums[i], nums[i + 1])
            }
            checker = !checker
        }

while문의 탈출을 위해서 그리고, min, max를 반영하기 위해서 nums를 슬라이스해서 넣는다.

        for (let i = 0; i < nums.length; i++) {
            let calc
            if (checker === true) {
                calc = Math.min(nums[i], nums[i + 1])
            } else {
                calc = Math.max(nums[i], nums[i + 1])
            }
            checker = !checker
            nums = [...nums.slice(0, i), calc, ...nums.slice(i + 2)]
        }

전체 코드

var minMaxGame = function (nums) {

    while (nums.length !== 1) {
        let checker = true
        for (let i = 0; i < nums.length; i++) {
            let calc
            if (checker === true) {
                calc = Math.min(nums[i], nums[i + 1])
            } else {
                calc = Math.max(nums[i], nums[i + 1])
            }
            checker = !checker
            nums = [...nums.slice(0, i), calc, ...nums.slice(i + 2)]
        }
    }
    return nums
};

문제는 풀고나니 별거 없었지만, 뭔가 손이 너무 안가는 문제였다. 이상한 공포가 느껴졌다고해야하나.. 리트코드 UI가 익숙하지 않아서그런가.. 손이 잘안가지만, 손을 자주 대는 연습을 해야겠다.