(1).백준 30804번 과일 탕후루는 슬라이딩 윈도우 문제였는데

처음에는 당연히 배열까지 출력해야 한다는 생각에 배열을 추가한 다음

letft, right가 변경될 때마다 push, shfit를 사용해서 결과 배열을 관리해줬는데

처음 제출 시 오답이 나와서 화급히 해당 내용을 제거했다.

 

사실 생각해보면 maxLength가 변경될 때만 해당 배열로 깊은복사값을 넣어주면 됐을 것 같고

어차피 요구에는 최대 길이 하나였기 때문에 고민할 필요도 없었다.

 

사실 틀린 이유는 배열 추가 관리랑 관련없이 input 형태를 js 테스트용으로 하고 그대로 전달했기 때문이었는데

틀렸다고 생각하고 혼자 코드 점검하고 고친게 재밌기도 하고

평소에도 개선점이 있는지 한번쯤 더 생각하고 작성하면 좋을 것 같다.

 

코드에서는 기본적으로 한칸씩 범위를 우측으로 증가시키면서 포함된 종류를 fruitMap에 담아서 관리해줬고

만약 종류 숫자가 2개가 넘어가는 순간 왼쪽에서부터 한칸씩 다가오며 종류가 2개가 되는 시점을 확인 후 넘어갔다.

 

과일 종류를 관리하는 방법은 개체에 담아서 사용했는데

다른 언어는 일반적으로 map에 담아서 사용하지만 js에서는 객체가 편해서 바로 사용해줬는데

오랜만에 들어있는 개수를 꺼내려고 보니 java의 valuse.length 말고 생각이 나지 않았고

Object.keys(fruitMap).length를 통해서 할 수 있었다.

 

map에서 숫자를 관리할 때 보통 0이면 넘어가는 방식으로 그냥 넘어갔었는데

이번엔 length로 바로 개수를 확인하지 않으면 복잡도가 지나치게 올라가서 메서드를 찾았는데

delete를 통해서 개체에 담긴 키값을 제거할 수 있었다.

 

의외로 js는 3년 가까이 썼던 것 같은데 이걸 안써본건지 기억이 안나는건지

어쨌거나 처음 보는 것 같아서 신기하기도 했다.

 

max와 관계없이 두개 또는 그 이하의 종류를 끝까지 진행하는 방식이기 때문에

가장 긴 시점을 maxLength에 담아서 각각의 첫번째 while문이 진행될 때마다 Math.max로 비교해줬고

maxLength를 출력해서 문제를 해결했다.

 

일반적으로 난이도가 조금 더 있으면 가장 긴 배열을 출력하라고 하기 때문에

위에서 언급한 것 처럼 maxLength는 그대로 같이 관리하면서 right - left + 1이 더 큰지 확인해서 

깊은복사로 arr만 갱신해주고 해당 배열을 출력하는 방법으로 할 수 있을 것 같다.

const input = `5
5 1 1 2 1`.split('\n')[1].split(' ').map(Number)

let left = 0
let right = 0
let maxLength = 0
const fruitMap = {}

while(right < input.length){
    let fruit = input[right]
    if(fruitMap[fruit]){
        fruitMap[fruit]++
    }
    else{
        fruitMap[fruit] = 1
    }

    while(Object.keys(fruitMap).length > 2){
        if(fruitMap[input[left]] == 1){
            delete fruitMap[input[left]]
        }
        else{
            fruitMap[input[left]]--
        }
        left++
    }
    maxLength = Math.max(maxLength, right - left + 1)
       
    right++
}

console.log(maxLength)

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

[개발일지] - 476  (0) 2024.10.21
[개발일지] - 475(주말)  (0) 2024.10.20
[개발일지] - 473  (0) 2024.10.18
[개발일지] - 472  (0) 2024.10.17
[개발일지] - 471  (3) 2024.10.16

+ Recent posts