Level 1 - 바탕화면 정리

2024. 3. 27. 15:10알고리즘/프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/161990

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

행을 기준으로 파일이 있는 좌표를 탐색해서 배열에 넣어주고, 열을 기준으로 파일이 있는 좌표를 탐색해서 배열에 담아준다. 이때 서로 다른 배열에 담아야한다.

행을 기준으로 탐색했을 때 가장 먼저 나오는 파일의 행의 좌표가 시작좌표 x값이 된다.

열을 기준으로 탐색했을 때 가장 먼저 나오는 파일의 열의 좌표가 시작좌표 y값이 된다.

끝 좌표는 반대로 생각하면 된다.

행을 기준으로 가장 마지막에 탐색된 파일의 행의 좌표에 1을 더한 값이 끝좌표 x값이 된다.

열을 기준으로 가장 마지막에 탐색된 파일의 열의 좌표에 1을 더한 값이 끝좌표 y값이 된다.

function solution(wallpaper) {
    let s = [];
    let e = [];
    let ret = [];
    let h = wallpaper.length;
    let w = wallpaper[0].length;
    for(let i = 0 ;i<h;i++){
        for(let j = 0; j<w;j++){
            if(wallpaper[i][j]==='#') s.push(i);
        }
    }
    for(let i = 0; i<w;i++){
        for(let j = 0;j<h;j++){
            if(wallpaper[j][i]==='#') e.push(i);
        }
    }
    ret.push(s[0]);
    ret.push(e[0]);
    ret.push(s[s.length-1]+1);
    ret.push(e[e.length-1]+1);
    return ret;
}

 

다른 풀이

function solution(wallpaper) {
    let left = [];
    let top = [];
    let right = []
    let bottom = [];
    wallpaper.forEach((v,i) => {
        [...v].forEach((val,ind) => {
            if(val === "#") {
                left.push(i)
                top.push(ind)
                right.push(i + 1)
                bottom.push(ind + 1)
            }
        })
    })
    return [Math.min(...left), Math.min(...top), Math.max(...right), Math.max(...bottom)]
}

left, top, right, bottom 네 개의 점을 활용한다.

left랑 top은 시작좌표를 의미하고 right와 bottom은 끝좌표를 의미한다.

파일이 있는 모든 좌표값을 구한다음에 시작좌표에 해당하는 left, top은 최솟값을 리턴하도록 하고, right와 bottom은 최댓값을 리턴하도록 한다. 왜냐하면 시작 좌표는 가장 먼저 등장하는 파일을 포함해야하고 끝 좌표는 가장 나중에 등장하는 파일을 포함해야하기 때문이다.