Welcome! Everything is fine.

[프로그래머스/Lv.1] 바탕화면 정리 - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] 바탕화면 정리 - Java

개발곰발 2024. 4. 16.
728x90

📌 문제

 

프로그래머스

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

programmers.co.kr

📌 풀이

직접 그림을 그려가며 푸니 바로 이해되는 문제였다. 그러나 Math.min()과 Math.max()를 사용해 최솟값과 최댓값을 구하는 과정에서 힌트를 찾아보았다. 머리로는 알아도 막상 코드로 구현하려니 바로바로 되진 않았다.

 

바탕화면에 파일이 예시처럼 있다면, 드래그 하는 시작점은 (가장 위쪽, 가장 왼쪽) 인 (0, 1) 이고, 끝점은 (가장 아래쪽, 가장 오른쪽) 인 (3, 4) 이다.

0 1 2 3 4 5
1   #      
2     #    
3       #  

 

정리하면, wallpaper 배열을 이중 for문으로 돌며 '#' 가 포함되는 인덱스를 통해 아래 항목을 찾아낸다.

  • 가장 위쪽에 있는 i → minRow
  • 가장 왼쪽에 있는 j → minCol
  • 가장 아래쪽에 있는 i → maxRow
  • 가장 오른쪽에 있는 j → maxCol

'#'가 포함된다면 i과 j의 값을 Math.min(), Math.max() 함수에 넣고 최솟값과 최댓값을 비교해 기존의 값과 교체한다.

📌 전체 코드

마지막에 maxRow와 maxCol에 1을 더해준 것은 wallpaper를 순회할 때 시작점이 0이기 때문이다. 1을 더해주어야 우리가 원하는 좌표가 나온다.

class Solution {
    public int[] solution(String[] wallpaper) {
        int minRow = Integer.MAX_VALUE;
        int minCol = Integer.MAX_VALUE;
        int maxRow = Integer.MIN_VALUE;
        int maxCol = 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) == '#') {
                    minRow = Math.min(minRow, i);
                    minCol = Math.min(minCol, j);
                    maxRow = Math.max(maxRow, i);
                    maxCol = Math.max(maxCol, j);
                }
            }
        }
        
        return new int[] {minRow, minCol, maxRow + 1, maxCol + 1};
    }
}