[Algorithm] 바탕화면 정리

Jong Min ·2025년 4월 2일

Algorithm

목록 보기
26/30

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

바탕화면 정리

📌 문제 설명

문자열 배열 wallpaper 가 있다. 빈칸은 . , 파일이 있는 칸은 # 값을 가진다. 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 지우려고 한다.

드래그 방법

  • 드래그는 바탕화면의 격자점 S(lux, luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdx, rdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다.
  • 이때, "점 S에서 점 E로 드래그한다"고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.
  • 점 S(lux, luy)에서 점 E(rdx, rdy)로 드래그를 할 때, "드래그 한 거리"는 |rdx - lux| + |rdy - luy|로 정의합니다.
  • 점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.

제한사항

  • 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를 만족해야 합니다.

💡 접근 방법

🔍 문제 해결 방법

제한 사항을 보면 최대값이 50이므로 단순 반복으로도 찾을 수 있다고 판단했습니다.

따라서 이중 for문을 이용하여 #이 있는 위치를 찾고,

  • 최솟값을 기록하는 경우 : 드래그의 시작점
  • 최댓값을 기록하는 경우 : 드래그의 끝점

이라고 가정하고 문제를 해결했습니다.

주의: 끝점에서 +1을 더해야 하는데, 이는 끝점에서부터 파일 크기만큼 추가해야 하기 때문입니다.

코드 구현

public static int[] solution(String[] wallpaper) {
    int[] answer = {50, 50, 0, 0};
    for (int i = 0; i < wallpaper.length; i++) {
        for (int j = 0; j < wallpaper[0].length(); j++) {
            if (wallpaper[i].charAt(j) == '#') {
                answer[0] = Math.min(answer[0], i); // lux 값 업데이트
                answer[1] = Math.min(answer[1], j); // luy 값 업데이트
                answer[2] = Math.max(answer[2], i + 1); // rdx 값 업데이트
                answer[3] = Math.max(answer[3], j + 1); // rdy 값 업데이트
            }
        }
    }
    return answer;
}

✅ 코드 설명

  1. answer 배열을 초기화합니다. ({50, 50, 0, 0})

    • 최소값을 찾기 위해 충분히 큰 값 (50)
    • 최대값을 찾기 위해 충분히 작은 값 (0)
  2. #이 있는 경우:

    • answer[0] (lux) → 현재 최소 행을 업데이트
    • answer[1] (luy) → 현재 최소 열을 업데이트
    • answer[2] (rdx) → 현재 최대 행을 업데이트 (i + 1 고려)
    • answer[3] (rdy) → 현재 최대 열을 업데이트 (j + 1 고려)
  3. answer 배열을 반환합니다.

출력 결과

// 입력 
[".#...", "..#..", "...#."]
// 출력
[0, 1, 3, 4]

(0,1) ~ (3,4)의 범위를 드래그하면 모든 #이 포함됩니다.


🎯 정리

  • 이중 for문을 사용하여 #을 찾는다.
  • 최소값 (lux, luy), 최대값 (rdx, rdy) 갱신
  • 드래그의 끝점(rdx, rdy)에서 +1 추가
profile
노력

0개의 댓글