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

윤준혁·2024년 3월 10일

나의 풀이

class Solution {
    public int[] solution(String[] wallpaper) {
        int[] answer = new int[4]; // 1
        int x_min = 51;
        int x_max = 0;
        int y_min = 51;
        int y_max = 0;
        int[][] list = new int[wallpaper.length][wallpaper[0].length()];
        
        for (int i = 0; i < wallpaper.length; i++) { // 2
            for (int j = 0; j < wallpaper[i].length(); j++) {
                if (wallpaper[i].charAt(j) == '#') list[i][j] = 1;
                else list[i][j] = 0;
            }
        }
        
        for (int i = 0; i < list.length; i++) { // 3
            for (int j = 0; j < list[i].length; j++) {
                if (list[i][j] == 1) {
                    x_min = Math.min(x_min, j);
                    y_min = Math.min(y_min, i);
                    break;
                }
            }
        }
        
        for (int i = list.length - 1; i >= 0; i--) { // 4
            for (int j = list[i].length - 1; j >= 0; j--) {
                if (list[i][j] == 1) {
                    x_max = Math.max(x_max, j + 1);
                    y_max = Math.max(y_max, i + 1);
                    break;
                }
            }
        }
        
        answer[0] = y_min; // 5
        answer[1] = x_min;
        answer[2] = y_max;
        answer[3] = x_max;
        
        return answer;
    }
}

과정

1차원의 String 배열에서 특정한 값만 찾는 문제는 2차원의 int 배열에서 찾는 것과 비슷하다고 생각한다. 위 문제는 파일을 모두 선택할 수 있는 사각형의 왼쪽 위 모서리와 오른쪽 아래 모서리의 좌표를 구하는 것이다.
예를 들어, 입출력 예 1번의 경우 이런 식의 2차원 배열이 만들어진다.
01000
00100
00010

  1. answer의 배열의 크기는 4로 고정되고, wallpaper와 wallpaper[i]의 길이는 50 이하이므로, x축과 y축의 max와 min을 각각 0과 51로 둔다. 2차원 정수 배열로 바꿔주기위해 list를 생성
  2. wallpaper를 순회하며 '#'을 찾아서 1로두고 나머지는 0으로 바꿔준다
  3. list를 순회하며 왼쪽 위부터(정방향) #을 찾으면 기존의 x_min과 j, y_min과 i를 비교하여 더 작은 값을 min으로 한다
  4. list를 순회하며 오른쪽 아래부터(역방향) #을 찾으면 기존의 x_max와 j+1, y_max와 i+1을 비교하여 더 큰 값을 max로 한다(1을 더해주는 이유는 배열은 0부터 시작하고 좌표 체계는 1부터 시작하기 때문)
  5. 도출한 값을 answer에 순차적으로 넣는다

다른 사람 풀이

class Solution {
    public int[] solution(String[] wallpaper) {
        int minX = Integer.MAX_VALUE;
        int minY = Integer.MAX_VALUE;
        int maxX = Integer.MIN_VALUE;
        int maxY = 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)=='#'){
                    minX = Math.min(minX,i);
                    minY = Math.min(minY,j);
                    maxX = Math.max(maxX,i);
                    maxY = Math.max(maxY,j);
                }
            }
        }
        return new int[]{minX,minY,maxX+1,maxY+1};
    }
}
  • 내가 짠 코드는 내가 이해하기 쉽게 만든 코드다
  • 훨씬 간결해보이고 이쁘다

0개의 댓글