1.객체를 배열화 하려는 경우 Object.entries(objName)을 통해 만들 수 있는데
foodList는 객체에 entries 메서드를 사용할 경우 아래와 같은 결과가 된다. 

const foodList = {Pizza : 10, Cola : 10, Soda : 2, hotSource : 3}
Object.entries(foodList) => [[Pizza, 10],[Cola, 10],[Soda, 2],[hotSource, 3]]

 

이를 통해 순회할 때 사용하거나 데이터 순서 접근 등에 사용할 수 있다.
이전에 나온 내용이지만 깜빡했기 때문에 다시 한번 정리했다.


2.테스트를 진행할 때 상태관리나 훅 등의 provider를 사용하는 값을 가져오려고 하면
에러가 발생하며 provider 외부에서 사용할 수 없다고 하는 것을 볼 수 있다.

문제를 해결하기 위해서는 해당 provider를 test 파일 내부에 import한 다음
test 내부 render에서 해당 provider를 wrapper로 사용하면 된다.
예를 들어 사용 방식은 아래와 같다.

import ComponentForTest from "../component"
impory {importedProvider} from "../anyProviderRoute"

test("How to use wrapper", () => {
  render(<ComponentForTest>, {wrapper : importedProvider})
  expect(something).toHaveTextContent("test")
})


하지만 공통된 wrapper를 사용할 경우  
각각의 테스트마다 모두 개별적으로 적용하기는 어렵기 때문에 
provider로 이미 감싸진 테스트용 컴포넌트를 반환하는 jsx를 따로 만들어준 다음
해당 값을 export하거나 render라는 이름으로 반환해줘 render로 사용할 수 있다.

//wapper를 씌운 컴포넌트를 render하는 testUtil 파일 내부
import {render} from "@testing-library/react"
impory {importedProvider} from "../anyProviderRoute"

const randerWrapper = (component, options) => {
  return render(component, { wrapper : importedProvider, ...options })
}

export * from "testing-library/react"
export { randerWrapper as render }

 

//테스트 할 파일
import { render, screen, waitFor } from "route for testUtil"

test("How to use wrapper", () => {
  render(<ComponentForTest>)
  expect(something).toHaveTextContent("test")
})

wrapper 옵션을 render에 넣어주지 않아도 정상 작동하는 것을 볼 수 있다.





(1).백준 11279 최대 힙 문제는 어제 풀었던 최소 힙과 동일한 구조였고
유일한 차이점은 최소값이 아닌 최대값을 반환해야 한다는 것이었다.

입력시에는 현재 값을 마지막에 넣은 다음 거슬러 올라가야 하는데
해당 체크는 부등호의 표기만 반대로 하면 되고
출력시에도 root값이 출력된 다음 마지막 값을 넣고 하단으로 내려가야 하는데
해당 내용 또한 최소 힙과 반대 등호로 고쳐줘서 해결할 수 있었다.
(문제 해결방법이 궁금한 사람은 취업준비일지 129에 최소 힙 설명이 있다)

const input = `13
0
1
2
0
0
3
2
1
0
0
0
0
0`.split('\n').map(Number)

let arr = []
let result = []

const pushToHeap = (num) => {
    arr.push(num)
    let indexNow = arr.length-1
    while(indexNow > 0){
        const parentNode = Math.floor((indexNow-1)/2)
        if(arr[indexNow] > arr[parentNode]){
            const temp = arr[parentNode]
            arr[parentNode] = arr[indexNow]
            arr[indexNow] = temp
            indexNow = parentNode
        }
        else{
            break
        }
    }
}

const popFromHeap = () => {
    const popNumber = arr[0]
    const lastNum = arr.pop()
    if(arr.length === 0){
        return popNumber
    }
    arr[0] = lastNum
    
    let indexNow = 0
    while(arr[indexNow] < arr[indexNow*2+1] || arr[indexNow] < arr[indexNow*2+2]){
        const [child1, child2] = [indexNow*2+1, indexNow*2+2]
        if(arr[child1] < arr[child2]){
            const temp = arr[child2]
            arr[child2] = arr[indexNow]
            arr[indexNow] = temp
            indexNow = child2
        }
        else{
            const temp = arr[child1]
            arr[child1] = arr[indexNow]
            arr[indexNow] = temp
            indexNow = child1
        }
    }
    return popNumber
}

for(let i = 1 ; i < input.length ; i++){
    if(input[i] !== 0){
        pushToHeap(input[i])
    }
    else if(input[i] === 0 && arr.length === 0){
        result.push(0)
    }
    else{
        result.push(popFromHeap())
    }
}
console.log(result.join('\n'))



(2).백준 11286 절댓값 힙은 최소 힙과 유사하지만
절대값의 기준으로 최소값을 구해야 하는 문제였으며
추가적으로 절대값이 같은 경우에는 음수를 우선해 출력해야 했다.

최대 힙을 간단하게 해결한 다음 이번 문제도 어렵지 않을 거라고 생각했는데
절댓값을 기준으로 하기 때문인지 생각보다 비교해야 할 내용이 더 많았다.

제일 문제가 많이 되었던 부분은 더 작은 숫자가 아닌
절대값이 더 작은 숫자를 구별해야 하는 것 이었는데
-2, -1, 1, 2가 있을 경우 1과 -1은 절댓값 1로 추가비교를 하고
2의 경우에는 당연히 절대값이 더 크고 값도 더 크기 때문에 후순위로 밀려나지만
-2의 경우에는 처리를 제대로 하지 않을 경우 절대값으로 더 큰 숫자임에도 불구하고
절대값 비교 후 더 작은 숫자에서 -1, 1을 제치고 root로 올라갈 수 있다.

확인해보니 -2가 최상단으로 정렬된 것을 볼 수 있다.

push(입력)는 아래 코드 주석들에 자세히 적어뒀지만 아래와 같은 순서로 진행했고

1.절대값 비교 후 작은 경우 교체
2.절대값 비교 후 나온 else if에서 현재값과 절대값이 같지만 실제로는 작은 숫자인 경우
  교체해주기
3.더 크거나 같은 숫자들만 남은 마지막 else에서는 break 처리하기

 

pop(출력)은 더 복잡한 문제가 발생하는데 
자식들의 대소비교 또한 추가로 진행해야 하지만 자식값의 절대갑을 먼저 비교하고
그 후 다시 음수, 양수 여부도 한번 더 체크해야 했다.
pop 또한 아래와 같은 순서로 진행했다.

1.현재 값 보다 작거나 같은 절대값이 있을 경우 반복문을 돌린다.
2.작은 절대값이 있는 경우 child1,child2를 비교하며 더 작은 절대값 또는 값을 구해준다.
(절대값 대소 비교 및 동일할 경우 일반값 비교)
3.현재값보다 작은 절대값이 없는 경우 현재값이 양수인지 체크한다.
4.양수일 경우 현재값의 음수형태인 child가 있는지 확인하고 교체한다.
5.현재값의 음수버전이 없을 경우 중단한다.
6.음수일 경우 중단한다.

 

 

hip이 다 그렇지만 입력과 출력을 담당하는 함수만 잘 만들 경우
for문에서는 입/출력만 넣어주면 되기 때문에 하단의 입력은 그대로 사용했다.

 

지금 글을 정리하며 보니 change 부분을 따로 떼서 a,b를 넣으면 위치를 변경하는 함수를 따로 만드는 편이

더 깔끔하고 가독성이 좋은 코드가 될 것 같다.

const input = `7
2
-2
2
0
0
0
0`.split('\n').map(Number)

let arr = []
let result = []

//반복 Math.abs() 줄이는 용도
const abs = (num) => {
    return Math.abs(num)
}

// push할 경우 해당 값의 마지막에서 시작해서 위로 올라간다.
// 올라갈 때 비교는 두가지로 진행해야 하는데 
//     1.현재 절대값이 작은 경우는 기존 처리 그대로 진행
//     2.else if로 값이 작을 경우 위치 변경
//     3.else로 종료
//문제가 있는데 -2가 최상단에 들어가 있다...
//확인해보니 2번의 else if 부분이 대소비교가 되어버렸기 때문에
//-100같은 숫자가 들어가면 무조건 최상단으로 끌어올려지는 구조였다.
//더 작은 절대값을 걸렀기 때문에 현재 값이 양수이며
//비교값이 현재값의 음수버전일 경우만 교체하기로 수정했다.
//@@@오답 후 확인해보니 이건 현재값이 작아야 올라가기 때문에
//   현재 값이 양수가 아닌 음수일 때 교체해야 했다.
//(pop은 내려가야 하기 때문에 현재 값이 커야 하고 이건 올라가니 작아야 하는걸 깜빡했다)

const pushToHeap = (num) => {
    arr.push(num)
    let indexNow = arr.length-1
    while(indexNow > 0){
        const parentNode = Math.floor((indexNow-1)/2)
        if(abs(arr[indexNow]) < abs(arr[parentNode])){
            const temp = arr[parentNode]
            arr[parentNode] = arr[indexNow]
            arr[indexNow] = temp
            indexNow = parentNode
        }
        else if(arr[indexNow] < 0 && arr[indexNow] * (-1) === arr[parentNode]){
            const temp = arr[parentNode]
            arr[parentNode] = arr[indexNow]
            arr[indexNow] = temp
            indexNow = parentNode
        }
        else{
            break
        }
    }
}

// pop할 경우 최상단의 값에 최하단 값을 넣어준다.
// 반복 비교를 통해 내려가야 하는데 아래의 경우를 체크해야 한다.
//     1.현재 값 보다 작거나 같은 절대값이 있을 경우 반복문을 돌린다.
//     2.작은 절대값이 있는 경우 child1,child2를 비교하며 더 작은 절대값 또는 값을 구해준다.
//         (절대값 대소 비교 및 동일할 경우 일반값 비교)
//     3.현재값보다 작은 절대값이 없는 경우 현재값이 양수인지 체크한다.
//     4.양수일 경우 현재값의 음수형태인 child가 있는지 확인하고 교체한다.
//     5.현재값의 음수버전이 없을 경우 중단한다.
//     6.음수일 경우 중단한다.

const popFromHeap = () => {
    const popNumber = arr[0]
    const lastNum = arr.pop()
    if(arr.length === 0){
        return popNumber
    }
    arr[0] = lastNum
    
    let indexNow = 0
    while(abs(arr[indexNow]) >= abs(arr[indexNow*2+1]) || abs(arr[indexNow]) >= abs(arr[indexNow*2+2])){
        const [child1, child2] = [indexNow*2+1, indexNow*2+2]
        //작은 절대값 처리 (같을 경우에는 대소 비교를 해야 한다.)
        if(abs(arr[indexNow]) > abs(arr[indexNow*2+1]) || abs(arr[indexNow]) > abs(arr[indexNow*2+2])){
            if(abs(arr[child1]) > abs(arr[child2])){
                const temp = arr[child2]
                arr[child2] = arr[indexNow]
                arr[indexNow] = temp
                indexNow = child2
            }
            else if(abs(arr[child1]) < abs(arr[child2])){
                const temp = arr[child1]
                arr[child1] = arr[indexNow]
                arr[indexNow] = temp
                indexNow = child1
            } 
            //두 절대값이 같은 경우
            else{
                if(arr[child1] > arr[child2]){
                    const temp = arr[child2]
                    arr[child2] = arr[indexNow]
                    arr[indexNow] = temp
                    indexNow = child2
                }
                else{
                    const temp = arr[child1]
                    arr[child1] = arr[indexNow]
                    arr[indexNow] = temp
                    indexNow = child1
                }
            }
        }
        //작은 절대값은 처리했으니 양수 체크(양수면 동일 절대값 음수를 찾아야 함)
        else if(arr[indexNow] > 0){
            if(arr[indexNow]*(-1) === arr[indexNow*2+1]){
                const temp = arr[child1]
                arr[child1] = arr[indexNow]
                arr[indexNow] = temp
                indexNow = child1
            }
            else if(arr[indexNow]*(-1) === arr[indexNow*2+2]){
                const temp = arr[child2]
                arr[child2] = arr[indexNow]
                arr[indexNow] = temp
                indexNow = child2
            }
            else{
                break
            }
        }
        //이도저도 아니면 break 해줘야 하는 단계
        else{
            break
        }
    }
    return popNumber
}

for(let i = 1 ; i < input.length ; i++){
    if(input[i] !== 0){
        pushToHeap(input[i])
    }
    else if(input[i] === 0 && arr.length === 0){
        result.push(0)
    }
    else{
        result.push(popFromHeap())
    }
}
console.log(result.join('\n'))

'회고' 카테고리의 다른 글

[취업준비일지] - 132  (0) 2023.03.01
[취업준비일지] - 131  (0) 2023.02.28
[취업준비일지] - 129  (0) 2023.02.26
[취업준비일지] - 128  (0) 2023.02.25
[취업준비일지] - 127  (0) 2023.02.24

+ Recent posts