Practice for coding test

프로그래머스 - Level 1. 바탕화면 정리 / JavaScript (js)

Gray Park 2023. 3. 12. 12:30
728x90
반응형

문제설명

문제분석

모든 좌표를 순회하며 파일을 찾아 최소 x, 최소 y, 최대 x, 최대 y를 각각 구해 하나의 배열에 담아 리턴하는 문제입니다. 새로 올라온 level 1이기도 하고, 주말이기도 하니 빠르게 코딩해보겠습니다.

이해하기 쉽게 코드작성하기

function solution(wallpaper) {
    const file = "#";
    let offset = {
        minX: Infinity,
        minY: Infinity,
        maxX: -1,
        maxY: -1
    };
    
    for(let row = 0; row < wallpaper.length; row++) {
        for(let col = 0; col < wallpaper[row].length; col++) {
            if(wallpaper[row][col] === file) {
                const minX = Math.min(offset.minX, row);
                const minY = Math.min(offset.minY, col);
                const maxX = Math.max(offset.maxX, row);
                const maxY = Math.max(offset.maxY, col);
                offset = { minX, minY, maxX, maxY };
            }
        }
    }
    
    const { minX, minY, maxX, maxY } = offset;
    return [minX, minY, maxX + 1, maxY + 1];
}

Math.min, Math.max를 이용해 각 파일의 최소, 최대 좌표를 업데이트 합니다. 이후 그 결과를 리턴하고 있습니다.

 

어차피 배열 형태로 리턴하니, 이 문제에서는 객체가 아닌 배열로 해결하는 게 더 나아보입니다. 어차피 모든 값을 순회해야하므로 배열로 변경하면서 동시에 for 문을 대신해 forEach로 변경하겠습니다.

function solution(wallpaper) {
    const file = "#";
    let answer = [Infinity, Infinity, -1, -1];
    
    wallpaper.forEach((_, r) => {
        _.split("").forEach((el, c) => {
            if(el === file) {
                answer = [
                    Math.min(answer[0], r),
                    Math.min(answer[1], c),
                    Math.max(answer[2], r + 1),
                    Math.max(answer[3], c + 1),
                ]
            }
        });
    })
    
    return answer;
}

내부 forEach에서는 answer에 새로운 배열을 업데이트 하느냐, 값만 업데이트해주냐 고민했습니다. 제한사항에서 배열의 길이가 길지 않은 걸 확인해서 새로운 배열로 업데이트 해주었습니다. 만약 배열의 길이가 조금만 더 길어졌다면, 아마 값만 업데이트 하는 형태로 코딩했을 겁니다. (가비지 컬렉터가 있다 하더라도 코드가 실행 중일 때에는 메모리에 불필요한 값이 쌓여있을 수 있다고 생각해서 그렇습니다.)

728x90
반응형