본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / 바탕화면 정리 / JAVA]

by KDW999 2023. 3. 6.

https://school.programmers.co.kr/learn/courses/30/lessons/161990

 

프로그래머스

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

programmers.co.kr

 

 

 

문제 접근

문제에선 최소거리 구하는 공식을 (x2-x1) + (y2-y1)이라고 지정하였으나 생각해보니 시작점과 끝점을 드래그했을 때 만들어지는 사각형의 4면은 최소 x, y좌표 / 최대 x, y좌표로 둘러쌓여있다.

그렇기에 최소 x, y좌표 / 최대 x, y좌표를 구하는 계산을 해주고 2차원 배열로 파일의 위치를 찾으면 그 파일의 x, y좌표는 좌측 위를 가리키고 있기에 끝점의 경우는 마지막에 x+1, y+1해줘서 좌표가 우측 아래로 바꾸어준다.

class Solution {
    public int[] solution(String[] wallpaper) {
        int[] answer = new int[4];
        
        int minX = 50; // 요소의 최대 길이가 50이라 처음에 무조건 값을 넣어주기 위해
        int minY = 50;
        int maxX = 0;
        int maxY = 0;
        
        boolean flag = false;
        
        // 바탕화면 파일 위치 검사
        for(int x=0; x<wallpaper.length; x++) {
        	for(int y=0; y<wallpaper[x].length(); y++) {
        		if(wallpaper[x].charAt(y) == '#') { // 해당 위치에 파일이 있다면

        			if(flag = false) { // 첫 값 대입
        		       flag = true;
        		       minX = x;
        		       minY = y;
        		       maxX = x;
        		       maxY = y;
        			}
        			
        			if(x < minX) minX = x;
        			if(y < minY) minY = y;
        			if(x > maxX) maxX = x;
        			if(y > maxY) maxY = y;
        			
         		}
        	}
        }

        maxX++;
        maxY++;
        
        answer[0] = minX;
        answer[1] = minY;
        answer[2] = maxX;
        answer[3] = maxY;
        return answer;
    }
}

 

다른 사람 풀이

Integer.MAX_VALUE는 정수의 최대값

나와 풀이 방식은 유사하나 Math.min()과 max()로 최소 좌표, 최대 좌표를 바로 구하고 배열을 바로 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};
    }
}

댓글