Bleeding edge

[LeetCode] 2295. Replace Elements in an Array - 자바스크립트 0610 본문

코딩테스트 공부

[LeetCode] 2295. Replace Elements in an Array - 자바스크립트 0610

codevil 2022. 6. 10. 14:13

https://leetcode.com/problems/replace-elements-in-an-array/

 

Replace Elements in an Array - 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

문제 자체는 상당히 심플하다. nums에 있는 숫자를 operations에 주어진 arr에 따라 값을 바꾸도록한다

nums[0] 이 5라고 할 때, operation[n]이 [5, 4]라고 하면 nums[0]은 4로 바꾸는 문제이다.

이문제를 3번정도 풀이를 하고 나서 정답을 찾았는데 이는 문제를 잘못해석했다. 잘못된 풀이는 서술을하고, 잘못된 방향으로 문제는 서술하지 않겠다.

우선 이문제를 정말 간단하게 풀려면 for 문 2개를 사용해서 문제를 풀면된다 하지만 제한조건을 보면 알 수 있듯이

for문 2개가 나는 순간 우리 빅오형님의 철퇴를 맞기 때문에 for문은 1개로 족하다. 그리고 이렇게 시간이 부족한 문제는 map을 활용해서 풀이를 하는 것이 빠르다. 

문제 풀이

1. map을 2개 생성한다. map, endMap

2. operations[n][0]이 map에 없으면, map.set(operations[0], operations[1])

3. 동시에 endMap에 endMap.set(operations[1], operations[0])을 넣는다.

3번을 하는 이유는, [3,1], [1,2] 와같이 operations가 되어있다면 [3,2]로 수정해야하기 때문이다. 여기서 함정은, [3,1], [2,1], [1,2]와 같은 순서로 대입된다면 [3,2], [2,1]이 되어야한다.

    let map = new Map()
    let endMap = new Map()
    for (let i = 0; i < operations.length; i++) {

            map.set(operations[i][0], operations[i][1])
            endMap.set(operations[i][1], operations[i][0])

    }

4. endMap의 key값이 있는지 체크하고, endMap key 값이 존재한다면, map.set(endMap.get(operations[i][0]), operations[i][1])로 map값을 업데이트하고 endMap역시 방금 세팅한 map값의 key를 value로 value를 key로 입력하고 이전에 가지고 있던 endMap은 삭제한다

    for (let i = 0; i < operations.length; i++) {
        if (!endMap.has(operations[i][0])) {
            map.set(operations[i][0], operations[i][1])
            endMap.set(operations[i][1], operations[i][0])
        }
        else {
            map.set(endMap.get(operations[i][0]), operations[i][1])
            endMap.set(operations[i][1], endMap.get(operations[i][0]))
            endMap.delete(operations[i][0])
        }
    }

5. nums의 요소들을 map에 가지고 있는지 루프문을 돌려서, 값이 존재한다면 변경한다.

    for (let i = 0; i < nums.length; i++) {
        if (map.has(nums[i])) {
            nums[i] = map.get(nums[i])
        }
    }

전체 풀이

var arrayChange = function (nums, operations) {
    let map = new Map()
    let endMap = new Map()
    for (let i = 0; i < operations.length; i++) {
        if (!endMap.has(operations[i][0])) {
            map.set(operations[i][0], operations[i][1])
            endMap.set(operations[i][1], operations[i][0])
        }
        else {
            map.set(endMap.get(operations[i][0]), operations[i][1])
            endMap.set(operations[i][1], endMap.get(operations[i][0]))
            endMap.delete(operations[i][0])
        }
    }
    for (let i = 0; i < nums.length; i++) {
        if (map.has(nums[i])) {
            nums[i] = map.get(nums[i])
        }
    }
    return nums
};

map문제를 지금까지 그래도 몇개는 풀어봤었는데 map문제를 정말 깔끔하게 정리하면서 풀 수 있었던 문제였던거 같다. 단지, 문제에 주어진 조건으로 한번에 풀기엔 ;ㅁ; 시행착오가 좀 있는 문제라서 테스트케이스를 좀 더 잘 잡아야겠다는 생각이들었다.(라고 하기엔.. 문제에서 뭔가 덜준거같은 느낌이 살짝 듭니다!)