https://school.programmers.co.kr/learn/courses/30/lessons/161990
파일의 위치를 '#', 빈 공간을 '.'로 나타내는 문자열 배열 'wallpaper' 가 주어질 때, 단 한 번의 드래그로 모든 파일을 선택하려한다. 이 때 시작점(x1, y1)과 끝점(x2, y2)의 거리가 최소가 되는 좌표를 x1, y1, x2, y2 순으로 배열에 담아 리턴해보자.
wallpaper | result |
---|---|
[".#...", "..#..", "...#."] | [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는 파일이 존재하는 맨 아래 행, 맨 오른쪽 열이 될것이고, 이 경우는 제일 큰 값이 된다!
따라서 맨 첫번째 원소부터 돌면서 '#'가 발견되면 각 지점의 좌표들을 초기화 시켜주면 된다.
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};
}
}
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]