본문 바로가기
99클럽/6기

99클럽 코테 스터디 3일차 TIL - 바탕화면 정리 (프로그래머스)

by nowjin 2025. 4. 2.

오늘의 학습 키워드

  • 문자열 배열
  • 2차원 배열 순회
  • 최소/최대값 갱신
  • 드래그 범위 계산
  • 좌표 계산
  • 구현

 

 

공부한 내용 정리

오늘은 프로그래머스의 “바탕화면 정리” 문제를 풀었다.
이 문제는 바탕화면의 파일(#)들을 모두 드래그해서 선택하려고 할 때, 가장 효율적인 드래그 범위를 계산하는 구현 문제다.

핵심은 파일이 위치한 모든 좌표들을 순회하면서,

  • 가장 위쪽(lux),
  • 가장 왼쪽(luy),
  • 가장 아래쪽(rdx),
  • 가장 오른쪽(rdy)

을 각각 구한 뒤, 사각형 범위로 감싸는 것이다.

드래그는 좌상단 포함, 우하단은 다음 칸까지 포함해야 하기 때문에 rdx + 1, rdy + 1 처리가 필요하다.
이를 통해 [lux, luy, rdx+1, rdy+1]을 반환하면 정답이다.


소스코드

class Solution {
    public int[] solution(String[] wallpaper) {
        // 최소 값 구히기 : lux, luy 는 최대값으로
        int lux = Integer.MAX_VALUE;
        int luy = Integer.MAX_VALUE;
        // 최대 값 구하기 : rdx, rdy 는 최소값으로
        int rdx = Integer.MIN_VALUE;
        int rdy = Integer.MIN_VALUE;
        
        // 바탕화면 한칸씩 스캔
        for(int i = 0; i < wallpaper.length; i++){
            // 바탕화면 첫 번째 줄 확인
            for (int j = 0; j < wallpaper[0].length(); j++){
                // 만약 파일이 있는 위치라면
                if (wallpaper[i].charAt(j) == '#'){
                    // 가장 작은 행/열 갱신 = 드래그 시작점
                    lux = Math.min(lux, i);
                    luy = Math.min(luy, j);
                    // 가장 큰 행/열 갱신 = 드래그 끝점
                    rdx = Math.max(rdx, i);
                    rdy = Math.max(rdy, j);
                }
            }
        }
        // 드래그는 오른쪽 아래 점까지 포함 안 되기 때문에 +1
        return new int[]{lux, luy, rdx + 1, rdy + 1};
    }
}

오늘의 회고

• 어떤 문제가 있었고, 나는 어떤 시도를 했는지
처음에는 드래그 거리 계산 기준이 애매해서 (rdx, rdy) 범위 설정에 혼동이 있었다.
또한, 시작점과 끝점이 좌상단/우하단으로 고정된다는 점을 놓쳐서 예외 처리에 주의가 필요했다.

• 어떻게 해결했는지
파일이 있는 좌표마다 최소값/최대값을 갱신하면서 좌상단과 우하단 좌표를 정확히 추적했고,
끝점은 포함되지 않으므로 +1을 해줘야 한다는 조건을 꼼꼼히 반영했다.

• 무엇을 새롭게 알았는지

  • 2차원 좌표 문제에서는 min/max 갱신 방식이 매우 유용하다는 걸 체감했다.
  • 드래그 거리 계산에서 포함/비포함의 기준이 실제 구현에 큰 영향을 줄 수 있다는 점도 중요했다.
  • Java에서 좌표 계산 시 Integer.MAX_VALUE, Integer.MIN_VALUE를 초기값으로 쓰면 오류 없이 범위를 구할 수 있다.

• 내일 학습할 것은 무엇인지
내일은 BFS/DFS 탐색이 포함된 2차원 배열 문제를 풀어보며, 본격적인 탐색 알고리즘을 Java에서 구현하는 연습을 할 예정이다.