[프로그래머스] 바탕화면 정리 (Java/Python)

Jiwoo·2023년 3월 13일
0

programmers

목록 보기
1/14

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

문제요약


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

제한사항


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

입출력 예


wallpaperresult
[".#...", "..#..", "...#."][0, 1, 3, 4]
["..........", ".....#....", "......##..", "...##.....", "....#....."][1, 3, 5, 8]
[".##...##.", "#..#.#..#", "#...#...#", ".#.....#.", "..#...#..", "...#.#...", "....#...."][0, 0, 7, 9]
["..", "#."][1, 0, 2, 1]

문제풀이


예제 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]

0개의 댓글

관련 채용 정보