programmers

[Programmers Level 1] 바탕화면 정리 Javascript

냠냠맨 2023. 3. 5. 00:32

⚡문제정보

지금 기준 최신으로 나온 문제 중 하나입니다.

문제가 정말...더럽게 길지만. 여러분들의 시간을 위해 문제를 요약하자면 이렇습니다.

한번의 드래그로 모든 파일을 버리고 싶다.

근데 최소한의 드래그로 버릴 방법을 찾아줘라

반환은 [y,x , y ,x] 좌표 형식으로 반환해라.

입출력을 보면 직관적입니다.

뭐야 직관적이라면서요 제 직관 돌려줘요

그냥 .은 비어있는걸 뜻하고 #은 파일이 있는걸 뜻합니다.

그리고 반환은 

[y축에서 가장 작은값, x축에서 가장 작은값, y축에서 가장 큰값 +1 , x축에서 가장 큰값 +1]

을 반환하면된다...

문제가 너무 어지럽게 길어서 문제를 파악하고 여기까지 생각이 도달하는 것이 어렵지

구현 자체는 쉬워서 1레벨이 아닌가... 생각해봅니다.


🔍접근방법

1레벨이니까 브루트포스해도 되겠지 뭐기도했지만
x,y축의 최대길이가 50 , 50이었습니다.
50^2는 2500 최악의 경우에도 2500번 순회면 뭐... 충분히 브루트포스해도 되겠다는 생각으로
그냥 다 찾으면서 정석대로 풀었습니다.

생각해보니 Map을 굳이 쓸 필요도없이 배열을 만들어줘도 되었겠지만.
그냥 map에다가 배열을 담는 형식으로 풀었습니다.

😑나의 풀이

function solution(wallpaper) {
    let map = new Map()
    map.set('arrX',[])
    map.set('arrY',[])

    let answer = []
    wallpaper.forEach((ele,y) => {
        let spliter = ele.split('')
        spliter.forEach( (it,x) => {
            let pushx = map.get('arrX')
            let pushy = map.get('arrY')
            
            if(it === '#') {
                pushx.push(x)
                pushy.push(y)
            }
        }) 
    })
    answer.push(Math.min(...map.get('arrY')))
    answer.push(Math.min(...map.get('arrX')))
    answer.push(Math.max(...map.get('arrY')) +1 )
    answer.push(Math.max(...map.get('arrX')) +1)
    return answer
}

근데 굳이 이럴필요가 없었다는 점..

한번의 순회로 풀 방법을 생각해봤습니다.

물론 내부적으로는 아니겠지만... indexOf와 lastIndexOf를 잘조합하면

어차피 중간 값들은 쓰레기니까

모두 완전탐색하는거보다는 훨씬 효율적일것입니다.

function solution(wallpaper) {
    let [arrX,arrY,answer] = [[],[],[]] 
    wallpaper.forEach((ele,y) => {
        let min = ele.indexOf("#")
        let max = ele.lastIndexOf("#")
        if(min !== -1) {
            arrX.push(min)
            arrY.push(y)
        }
        if(max !== -1) {
            arrX.push(max)
            arrY.push(y)
        }
    })
    answer.push(Math.min(...arrY), Math.min(...arrX) , Math.max(...arrY)+1, Math.max(...arrX)+1)
    return answer
}

이렇게 느리던 테스트가...

 

indexof를 적극사용하니 확실히 성능이 더 좋아졌네요

반응형