https://school.programmers.co.kr/learn/courses/30/lessons/161990
문제가 길고 이미지 파일이 여러 있기 때문에 문제 링크로 직접 보는 것을 추천한다.
해당 문제는 바탕화면에 있는 모든 파일을 최소한의 영역으로 드래그하여 삭제하는 것이다.
즉 모든 위치의 파일이 들어갈 수 있는 직사각형들 중 가장 작은 직사각형을 구하는데, 이 때 직사각형의 4좌표 중 가장 좌측 상단에 있는 좌표와 가장 우측 하단에 있는 좌표를 구하면 된다.
가장 좌측 상단에 있는 좌표는 (파일의 위치 좌표 중 y의 최솟값, 파일의 위치 좌표 중 x의 최솟값)이고,
가장 우측 하단에 있는 좌표는 (파일의 위치 촤표 중 y의 최댓값 + 1, 파일의 위치 좌표 중 x의 최댓값 + 1)이다.
우측 하단에 있는 좌표에 각 1씩을 더한 이유는 파일이 있는 영역이 사각형 모양으로 두 점을 차지하고 있어서 구하려고자 하는 전체 영역의 오른쪽 끝부분은 해당 값들에서 +1 해주어야 한다.
이해를 위한 입출력 예시
Header 1 | Header 2 |
---|---|
[".#...", "..#..", "...#."] | [0, 1, 3, 4] |
["..........", ".....#....", "......##..", "...##.....", "....#....."] | [1, 3, 5, 8] |
/**
* (가장 작은 y, x) ~ (가장 큰 y + 1, x + 1)
*
*/
class Solution {
public int[] solution(String[] wallpaper) {
int topY = 51; // wallpaper의 길이는 50 이하이기 때문에 51부터 도달할 수 없는 '최댓값'
int topX = 51;
int bottomY = -1; // wallpaper의 길이는 0 이상이기 때문에 -1부터 도달할 수 없는 '최솟값'
int bottomX = -1;
for (int i = 0; i < wallpaper.length; i++) { // 문자열 개수(ex. .#...)만큼 반복
for (int j = 0; j < wallpaper[i].length(); j++) { // 해당 문자열 길이만큼 반복
if (wallpaper[i].charAt(j) == '#') { // '#'이면 파일 발견
topY = Math.min(topY, i); // 구하려고자 하는 좌측 상단의 좌표에 y좌표 최소값 갱신
topX = Math.min(topX, j); // x좌표 최소값 갱신
bottomY = Math.max(bottomY, i + 1); // 구하려고자 하는 우측 하단의 y좌표 최대값 갱신
bottomX = Math.max(bottomX, j + 1); // x좌표 최대값 갱신
}
}
}
return new int[]{topY, topX, bottomY, bottomX}; // (가장 작은 y, x) ~ (가장 큰 y + 1, x + 1)
}
}