본문 바로가기
Algorithm Practice/Programmers

[Programmers] 바탕화면 정리 (Java / Python)

by 1000zoo 2023. 8. 31.

문제 링크

 

문제 설명

파일의 위치를 '#', 빈 공간을 '.'로 나타내는 문자열 배열 wallpaper가 주어질 때, 단 한 번의 드래그로 모든 파일을 선택하려한다. 이 때 시작점(x1, y1)과 끝점(x2, y2)의 거리가 최소가 되는 좌표를 x1, y1, x2, y2 순으로 배열에 담아 리턴해보자.

 

제한 사항

  • 1 ≤ 'wallpapaer'의 길이 ≤ 50
  • 1 ≤ 'wallpapaer[i]'의 길이 ≤ 50
    • 모든 원소의 길이는 동일
  • wallpaper[i][j]는 바탕화면에서 i + 1행 j + 1열에 해당하는 칸의 상태를 표시
  • wallpaper[i][j]는 "#" 또는 ".".
  • 바탕화면에는 적어도 하나의 파일.
  • 드래그 시작점 (x1, y1)와 끝점 (x2, y2)는 x1 < x2, y1 < y2를 만족.

입출력 예

wallpaper result
[".#...", "..#..", "...#."] [0, 1, 3, 4]
["..........", ".....#....", "......##..", "...##.....", "....#....."] [1, 3, 5, 8]

문제 풀이

예제 2 번의 그림

편의상 x와 y로 적었지만, 주의할 점은 x가 세로, y가 가로이다. 따라서 이 경우 [1, 3, 5, 8]을 리턴해야 한다.
사람이라면 직관적으로 시작점과 끝점을 찾을 수 있다.
우선 x1부터 생각을 해보면, 파일이 존재하는 맨 윗줄 (행) 이 답이 될 것이다. 즉 파일이 존재하는 행들 중 제일 작은 값이다. 같은 방법으로 y1을 생각해보면, 파일이 존재하는 맨 왼쪽 줄 (열)이 될텐데, 이 경우 파일이 존재하는 열들 중 제일 작은값. 반대로 x2와 y2는 파일이 존재하는 맨 아래 행, 맨 오른쪽 열이 될것이고, 이 경우는 제일 큰 값이 된다!

따라서 맨 첫번째 원소부터 돌면서 '#'가 발견되면 각 지점의 좌표들을 초기화 시켜주면 된다.

 

코드

Java

public class DesktopCleanup {
    public int[] solution(String[] wallpaper) {
        int x1 = 50, y1 = 50;
        int x2 = -1, y2 = -1;

        for (int i = 0; i < wallpaper.length; i++) {
            for (int j = 0; j < wallpaper[0].length(); j++) {
                char temp = wallpaper[i].charAt(j);
                if (temp == '#') {
                    x1 = Math.min(x1, i);
                    y1 = Math.min(y1, j);
                    x2 = Math.max(x2, i + 1);
                    y2 = Math.max(y2, j + 1);
                }
            }
        }
        return new int[] {x1, y1, x2, y2};
    }
}

Python

def solution(wallpaper):
    answer = []

    x1 = y1 = 50
    x2 = y2 = -1

    for i, line in enumerate(wallpaper):
        for j, file in enumerate(line):
            if file == '#':
                x1 = min(x1, i)
                y1 = min(y1, j)
                x2 = max(x2, i + 1)
                y2 = max(y2, j + 1)

    return [x1, y1, x2, y2]

 

블로그 이전