프로그래머스 - 바탕화면 정리

KDG: First things first!·2024년 8월 6일
0

프로그래머스

목록 보기
5/18

문제 링크

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



문제 설명

문제가 길고 이미지 파일이 여러 있기 때문에 문제 링크로 직접 보는 것을 추천한다.



문제 해설

해당 문제는 바탕화면에 있는 모든 파일을 최소한의 영역으로 드래그하여 삭제하는 것이다.

즉 모든 위치의 파일이 들어갈 수 있는 직사각형들 중 가장 작은 직사각형을 구하는데, 이 때 직사각형의 4좌표 중 가장 좌측 상단에 있는 좌표와 가장 우측 하단에 있는 좌표를 구하면 된다.

가장 좌측 상단에 있는 좌표는 (파일의 위치 좌표 중 y의 최솟값, 파일의 위치 좌표 중 x의 최솟값)이고,
가장 우측 하단에 있는 좌표는 (파일의 위치 촤표 중 y의 최댓값 + 1, 파일의 위치 좌표 중 x의 최댓값 + 1)이다.

우측 하단에 있는 좌표에 각 1씩을 더한 이유는 파일이 있는 영역이 사각형 모양으로 두 점을 차지하고 있어서 구하려고자 하는 전체 영역의 오른쪽 끝부분은 해당 값들에서 +1 해주어야 한다.



이해를 위한 입출력 예시

Header 1Header 2
[".#...", "..#..", "...#."][0, 1, 3, 4]
["..........", ".....#....", "......##..", "...##.....", "....#....."][1, 3, 5, 8]



정답 코드

/**
 * (가장 작은 y, x) ~ (가장 큰 y + 1, x + 1)
 *
 */


class Solution {
    public int[] solution(String[] wallpaper) {

        int topY = 51; // wallpaper의 길이는 50 이하이기 때문에 51부터 도달할 수 없는 '최댓값'
        int topX = 51;
        int bottomY = -1; // wallpaper의 길이는 0 이상이기 때문에 -1부터 도달할 수 없는 '최솟값'
        int bottomX = -1;

        for (int i = 0; i < wallpaper.length; i++) { // 문자열 개수(ex. .#...)만큼 반복
            for (int j = 0; j < wallpaper[i].length(); j++) { // 해당 문자열 길이만큼 반복
                if (wallpaper[i].charAt(j) == '#') { // '#'이면 파일 발견
                    topY = Math.min(topY, i); // 구하려고자 하는 좌측 상단의 좌표에 y좌표 최소값 갱신
                    topX = Math.min(topX, j); // x좌표 최소값 갱신
                    bottomY = Math.max(bottomY, i + 1); // 구하려고자 하는 우측 하단의 y좌표 최대값 갱신
                    bottomX = Math.max(bottomX, j + 1); // x좌표 최대값 갱신
                }


            }
        }
        return new int[]{topY, topX, bottomY, bottomX}; // (가장 작은 y, x) ~ (가장 큰 y + 1, x + 1)
    }

}
profile
알고리즘, 자료구조 블로그: https://gyun97.github.io/

0개의 댓글