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

LeeYulhee·2023년 8월 22일
0

💻 문제 출처 : 프로그래머스_바탕화면 정리

👉 내가 작성한 답


class Solution {
    public int[] solution(String[] wallpaper) {
        
        // 가장 위의 #, 가장 왼쪽 #, 가장 밑의 #, 가장 오른쪽의 #
        
        int lux = wallpaper.length;
        int luy = wallpaper[0].length();
        int rdx = 0;
        int rdy = 0;
        
        for(int i = 0; i < wallpaper.length; i++) {
            
            String element = wallpaper[i];
            
            if(element.contains("#")) {
                if(lux > i) {
                    lux = i;
                }
                if (rdx < i) {
                    rdx = i;
                }
                
                for(int j = 0; j < element.length(); j++) {
                    
                    char oneElement = element.charAt(j);
                    
                    if(oneElement == '#' && luy > j) {
                        luy = j;
                    }
                    if (oneElement == '#' && rdy < j) {
                        rdy = j;
                    }
                }
            }
        }
        
        int[] answer = {lux, luy, rdx + 1, rdy + 1};
        
        return answer;
    }
}

📌 문제 풀이 설명

  • int 변수 lux, luy, rdx, rdy를 각각 선언하고 초기화
    • lux는 가장 위의 #이 들어가야 하니 wallpaper의 길이로 선언(가장 큰 값이 들어가야 값을 비교했을 때 작은 값이 들어 가짐)
    • luy는 가장 왼쪽의 #이 들어가야 하니 wallpaper 요소의 길이로 선언
    • rdx는 가장 밑의 #이 들어가야 하니 0(가장 작은 값이 들어가야 비교했을 때 큰 값이 들어 가짐)
    • rdy는 가장 오른쪽의 #이 들어가니 0으로 선언
  • for문으로 0부터 wallpaper의 길이 미만까지 1씩 증가하며 순회
    • wallpaper[i]를 String element에 대입
    • 만약 element가 #을 포함했다면
      • 만약 lux(가장 위의 #)가 i보다 크다면
        • lux에 i를 대입
      • 만약 rdx(가장 밑의 #)가 i보다 작다면
        • rdx에 i를 대입
    • 이중 for문으로 0부터 element의 길이 미만까지 1씩 증가하며 순회
      • element의 j 번째 글자를 char 변수 oneElement에 대입
      • 만약 oneElement가 #과 같고, luy(가장 왼쪽의 #)가 j보다 크다면
        • luy에 j를 대입
      • 만약 oneElement가 #과 같고, rdy(가장 오른쪽의 #)이 j보다 작다면
        • rdy에 j를 대입
  • for문 종료 후 int 배열 answer를 생성해서 lux, luy, rdx + 1, rdy + 1을 생성 후 return
    • rdx와 rdy는 인덱스 값에 + 1 해야 마우스가 끝나는 지점의 좌표를 return 할 수 있음



👉 다른 사람이 작성한 답


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};
    }
}

📌 문제 풀이 설명

  • 각 int 변수인 minX, minY, maxX, maxY를 생성하고 초기화
    • minX와 minY에는 int에서 가장 큰 값을, maxX와 maxY에는 int에서 가장 작은 값을 넣음
  • for문으로 0부터 wallpaper의 길이 미만까지 1씩 증가하며 순회
    • 이중 for문으로 0부터 wallpaper 요소의 길이 미만까지 1씩 증가하며 순회
      • 만약 wallpaper i 번째 요소의 j 번째 글자가 #과 같다면
        • minX에 Math.min으로 minX와 i 중 작은 값을 대입
        • minY에 Math.min으로 minY와 j 중 작은 값을 대입
        • maxX에 Math.max로 maxX와 i 중 큰 값을 대입
        • maxY에 Math.max로 maxY와 j 중 큰 값을 대입
          • 각각 저장해야 하는 좌표 값이 가장 작거나 큰 값이기 때문에 Math의 min이나 max로 현재 가진 값과 비교해서 저장
  • for문 종료 후 int 배열을 생성해서 {minX, minY, maxX+1, maxY+1}를 넣어 return
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글