문제 링크
문제 설명
파일의 위치를 '#', 빈 공간을 '.'로 나타내는 문자열 배열 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] |
문제 풀이
편의상 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]
블로그 이전
'Algorithm Practice > Programmers' 카테고리의 다른 글
[Programmers] 둘만의 암호 (Java / Python) (0) | 2023.09.01 |
---|---|
[Programmers] 카드뭉치 (Java / Python) (0) | 2023.09.01 |
[Programmers] 달리기 경주 (Java / Python) (0) | 2023.08.31 |
[Programmers] 보석 쇼핑 (Java / Python) (0) | 2023.08.31 |
[Programmers] 비밀지도 (Java / Python) (0) | 2023.08.08 |