본문 바로가기

알고리즘/구현

[프로그래머스] lv1 바탕화면 정리 java [구현][엄탱]

728x90

문제 링크

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

 

프로그래머스

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

programmers.co.kr

문제 설명

문제는 길기 때문에 링크를 통해서 보는 것을 추천한다.

요약하자면, 마우스를 움직여서 파일들을 삭제하는데 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열을 return 하는 문제이다.

해설

처음 접근 방법을 내가 실제로 파일을 최소한의 마우스 움직임으로 삭제를 할 때 어떻게 하나 생각을 해보았다.

그랬더니 가장 위에 있는 파일, 가장 왼쪽에 있는 파일, 가장 오른쪽에 있는 파일, 가장 아래에 있는 파일을 찾고 그거에 맞게 마우스를 움직일 것 같다고 판단했기 때문에, 바탕화면 배열 wallpaper를 완전탐색하면서 가장 위, 왼쪽, 오른쪽, 아래를 지정하면 된다.

 

이때 세 가지 정도 중요한점이 있다.

1. [위, 왼쪽, 오른쪽, 아래]를 지정하면 된다.

2. 위와 왼쪽은 최소값을 구해야 하고 오른쪽과 아래는 최댓값을 구해야 한다. 

3. 0,0 에 파일이 존재한다면 위, 왼쪽은 [0, 0]이고 오른쪽, 아래 1씩 더한 값 [1, 1]이다.

 

코드 1

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

코드 2

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

 

728x90