본문 바로가기
코테 - 자바

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

by BIGENGINEER 2026. 7. 1.

프로그래머스 코딩테스트 > 연습 > 바탕화면정리

 

1. 초기 코드

- 문제 잘 못 이해한듯

class Solution {
    public int[] solution(String[] wallpaper) {
        int[] answer = {};
        
        //바탕화면 상태 문자열 배열 wallpaper
        //빈칸은 . 값이 있으면 #
        //점 S가 시작점 (lux,luy) ,점 E가 끝점(rdx, rdy)
        //거리는  |rdx - lux| + |rdy - luy| ->Math.abs 사용하기
        //  wallpaper = [".#...", "..#..", "...#."] -> 인수로 받아옴
        //최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열 return

        int n =0; 
        int m =0;
        
        
        //일단 wallpaper에서 값이 있는 부분을 확인
        for(int i=0; i<wallpaper.length; i++){
            //wallpaper의 인수 개수가 x축
            //문자열 인수의 길이가 y축
            int ynum = wallpaper[0].length(); // y축의 길이 알아내기 -> 항상 고정

            for(int j=0; j<wallpaper[i].length(); j++){
                char[] c = wallpaper[j].toCharArray();  //j가 0인건 #의 위치를 안다고 해도 그 다음 인덱스는? 

                if(c[j] == '#'){
                    n = j+1;
                    break;
                }
            }

        }
        return answer;
    }
}

 

 

2. 두 번째 코드

- 뭔가 방향은 잡아가는데 문제에서 원하는 것을 확실하게 알지 x

class Solution {
    public int[] solution(String[] wallpaper) {
        int[] answer = {};
        
        //바탕화면 상태 문자열 배열 wallpaper
        //빈칸은 . 값이 있으면 #
        //점 S가 시작점 (lux,luy) ,점 E가 끝점(rdx, rdy)
        //거리는  |rdx - lux| + |rdy - luy| ->Math.abs 사용하기
        //  wallpaper = [".#...", "..#..", "...#."] -> 인수로 받아옴
        //최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열 return
        int S = (lux, luy);
        int E = (rdx, rdy);
        
        //근데 x,y의 길이를 알 필요가 있남?
        //x축의 길이를 알기 - 세로방향 = wallpaper의 길이
        int x = wallpaper.length;
        
        //y축의 길이를 알기 - 가로방향 = wallpaper 인수의 길이
        int y = wallpaper[0].length;
        
        for(int i=0; i<wallpaper.length; i++){
            for(int j=0; j<wallpaper[i].length; j++){
                if(wallpaper[i][j] == '#'){
                    int y = j+1;
                    S = (x,y);
                }else{
                    continue;
                }
            }
        }
 
        return answer;
    }
}

 

 

 

3. 도움받은 코드

class Solution {
    public int[] solution(String[] wallpaper) {
        
        //바탕화면 상태 문자열 배열 wallpaper
        //빈칸은 . 값이 있으면 #
        //점 S가 시작점 (lux,luy) ,점 E가 끝점(rdx, rdy)
        //거리는  |rdx - lux| + |rdy - luy| ->Math.abs 사용하기
        //  wallpaper = [".#...", "..#..", "...#."] -> 인수로 받아옴
        //최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열 return

        /*
        2차원 탐색
      ↓
        '#' 발견
            ↓
        가장 위?
        가장 왼쪽?
        가장 아래?
        가장 오른쪽?
        계속 갱신
            ↓
        반복 끝
            ↓
        [minRow, minCol, maxRow+1, maxCol+1] */

        int h = wallpaper.length;
        int w = wallpaper[0].length();

        int minRow = h; //배열의 크기 4 열
        int minCol = w; //문자열의 길이 5 행

        int maxRow =0; 
        int maxCol =0;


        for(int i=0; i<h; i++){
            for(int j=0; j<w; j++){
                char c = wallpaper[i].charAt(j); //"..#.."의 각 자리

                if(c == '#'){
                    minRow = Math.min(minRow, i); //가장 위
                    minCol = Math.min(minCol, j); //가장 왼쪽
                    maxRow = Math.max(maxRow, i); //가장 아래
                    maxCol = Math.max(maxCol, j); //가장 오른쪽
                }
            }
        }

        int[] answer = {minRow, minCol, maxRow+1, maxCol+1};

        
        return answer;
    }
}

 

사고과정

 

1. 문제 읽고 반환값 봄

2. 입력 봄 -> 2차원 배열 떠올림 => 이중 for문

3. #만나면 뭐? => 함정 조심, 드래그를 구할 필요가 x

4. 가장 작은 사각형? => 문제에서 최소 이동거리 구하라고 했으므로

5. 그럼 사각형은? => 가장 위, 가장 왼쪽, 가장 아래, 가장 오른쪽으로 결정 => 변수 4개 필요

6. #을 볼때마다 혹시 더 위인가? 더 왼쪽인가? ...을 보면 됨 => Math.max / Math.min 사용

 

 

 

 

- 가장 작은 사각형

- 모든 점 포함

- 최소 범위

- 모든 좌표 포함

- 최소 영역

- 모든 파일 포함 

 

=> minX
minY
maxX
maxY 구하는 문제