[99클럽 6기/Java] 프로그래머스 - 바탕화면 정리

K-AKABANE·2025년 4월 2일

99클럽 6기 TIL

목록 보기
3/5
post-thumbnail

문제 요약 - 바탕화면 정리

바탕화면의 상태를 나타내는 문자열 배열 wallpaper가 주어진다.
파일은 바탕화면의 격자칸에 위치하며, 격자점은 (행, 열)의 꼴로 표시하고 왼쪽 위부터 (0, 0)으로 시작한다.
각 문자열은 .#로 이루어져 있으며, 각각 파일이 있는 칸과 빈칸을 의미한다.
모든 파일을 한번에 삭제하기 위한 최소한의 이동거리를 갖는 드래그의 시작점과 끝점의 좌표를 구하여라.

제한사항

1 ≤ wallpaper의 길이 ≤ 50
1 ≤ wallpaper[i]의 길이 ≤ 50
wallpaper의 모든 원소의 길이는 동일함
wallpaper[i][j]는 바탕화면에서 i + 1행 j + 1열에 해당하는 칸의 상태를 나타냄
wallpaper[i][j]는 "#" 또는 "."의 가짐
바탕화면에는 적어도 하나의 파일이 존재함이 보장됨
드래그 시작점 (lux, luy)와 끝점 (rdx, rdy)는 lux < rdx, luy < rdy를 만족해야 함

문제 분석

  • 문제의 요구사항을 달리 말하면, 모든 파일을 덮는(또는 포함하는) 직사각형의 왼쪽 위, 오른쪽 아래 좌표를 구하는 것과 같다.
  • 즉, 파일이 존재하는 칸의 좌표 x, y에 대한 최소값과 최대값 총 4가지 수를 구한다.

풀이

  • 드래그의 시작점을 나타내는 x1, x2와 끝점을 나타내는 y1, y2로 총 4개의 변수를 사용한다.
  • x1, x2에는 파일이 존재하는 칸의 x좌표에 대한 최소값과 최대값을 저장한다.
  • y1, y2에는 파일이 존재하는 칸의 y좌표에 대한 최소값과 최대값을 저장한다.
  • 메소드의 반환값으로 x1, y1, x2, y2를 원소로 하는 int 배열을 반환한다.

주의점

모든 파일을 포함해야 하기 때문에 끝점의 x, y 좌표에 각각 1을 더해야 한다.

작성 코드

class Solution {
    public int[] solution(String[] wallpaper) {
        int x1, x2, y1, y2;
        x1 = y1 = Integer.MAX_VALUE;
        x2 = y2 = Integer.MIN_VALUE;
        for(int i = 0; i < wallpaper.length; i++) {
            for(int j = 0; j < wallpaper[i].length(); j++) {
                if (wallpaper[i].charAt(j)=='#') {
                    x1 = Math.min(i, x1);
                    y1 = Math.min(j, y1);
                    x2 = Math.max(i, x2);
                    y2 = Math.max(j, y2);
                }
            }
        }
        return new int[]{x1, y1, x2+1, y2+1};
    }
}

결과

profile
Java is my life

0개의 댓글