문제가 있는 링크
문제
코딩 테스트를 준비하는 수줍음 많은 프로그래머들은 프로그래머의 문제를 풀고 작성한 코드를 컴퓨터 바탕화면 아무데나 저장해 두었다가 나중에 코드를 다시 찾아본다. 저장된 코드의 수가 늘어남에 따라 그는 자신의 컴퓨터 바탕 화면이 너무 어수선하다고 생각했습니다. 문제로 돌아가 프로그래머에서 작성한 코드를 확인할 수 있었기 때문에 저장한 모든 파일을 삭제하기로 결정했습니다.
컴퓨터 바탕 화면은 각 셀에 사각형이 있는 그리드입니다. 이 시점에서 컴퓨터 바탕 화면의 상태를 나타내는 문자열 배열 wallpaper주어진다. 파일은 데스크탑의 그리드에 있으며, 데스크탑의 그리드 포인트는 데스크탑의 왼쪽 상단에 (0, 0)으로 시작하여 (수직 좌표, 수평 좌표)로 표현됩니다. 공백에는 “.” 값이 있고 파일이 있는 공백에는 “#” 값이 있습니다. 드래그하여 파일을 선택하고 선택한 파일을 삭제할 수 있습니다. 모든 파일을 선택하여 이동거리를 최소화한 한번의 드래그로 한번에 삭제하고 싶은데 드래그로 파일을 선택하는 방법은 다음과 같습니다.
- 드래그는 그리드 점 S(
lux,luy) 마우스 왼쪽 버튼으로 그리드 포인트 E(rdx,rdy) 마우스 왼쪽 버튼을 놓습니다. 이때 “점 S에서 점 E로 끌기“이고, 점 S와 점 E는 각각 드래그의 시작점과 끝점입니다. - 포인트들(
lux,luy) 지점 E(rdx,rdy) 끌 때 “무승부 거리“는 |rdx–lux| + |rdy–luy|로 정의됩니다. - 점 S에서 점 E로 끌면 바탕 화면의 왼쪽 상단과 오른쪽 하단에 두 개의 그리드 점이 있는 사각형 내의 모든 파일이 선택됩니다.
예를 들어 wallpaper = (“.#…”, “..#..”, “…#.”) 바탕화면의 이미지로 다음과 같이 합니다.

그런 바탕화면에서 S(0, 1)에서 E(3, 4)로 드래그하면 아래 그림과 같이 3개의 파일이 모두 선택되므로 드래그한 거리는 (3 – 0) + (4 – 1) = 6이 최소 모든 파일을 선택할 수 있습니다.

(0, 0)에서 (3, 5)까지 드래그하여 모든 파일을 선택할 수도 있지만 이때 드래그한 거리는 (3 – 0) + (5 – 0) = 8로 그보다 더 깁니다. 이전 방법입니다.
수줍은 사람의 컴퓨터 데스크탑 상태를 나타내는 문자열 배열 wallpaper파라미터로 주어지면 바탕화면의 파일을 즉시 지울 수 있는 최소 이동 거리로 드래그의 시작점과 끝점을 포함하는 정수형 배열을 반환합니다. solution 함수를 작성해주세요. 드래그 시작점(lux, luy), 종점은 (rdx, rdy) 다음 정수 배열(lux, luy, rdx, rdy) 돌려주세요.
제한
- 1 ≤
wallpaper길이 ≤ 50 - 1 ≤
wallpaper(i)길이 ≤ 50wallpaper의 모든 요소는 길이가 같습니다.
wallpaper(i)(j)화면에i + 1선j + 1열에 해당하는 셀의 상태를 나타냅니다.wallpaper(i)(j)“#” 또는 “.” 값만 갖습니다.- 데스크탑에 하나 이상의 파일이 있습니다.
- 드래그 시작점(
lux,luy) 및 종점(rdx,rdy)이다lux<rdx,luy<rdy만족해야 합니다.
I/O 예시
| 배경 | 결과 |
|---|---|
| (“.#…”, “..#..”, “…#.”) | (0, 1, 3, 4) |
| (“………”, “…..#..”, “……##..”, “…##…. . “, “…..#…..”) | (1, 3, 5, 8) |
| (“.##…##.”, “#..#.#..#”, “#…#…#”, “.#…..#.”, ” ..#…#..”, “…#.#…”, “..#..”) | (0, 0, 7, 9) |
| (“..”, “#.”) | (1, 0, 2, 1) |
I/O 예시 설명
I/O 예제 #1
- 문제 설명에서 이와 같은 예입니다. (0,1)에서 (3,4)로 드래그할 때 모든 파일을 선택할 수 있으며 드래그한 거리는 6이었습니다. 거리가 6 미만인 모든 파일을 선택할 수 있는 방법이 없습니다. 따라서 (0, 1, 3, 4)를 반환합니다.
I/O 예제 #2
- 예제 #2의 바탕 화면은 다음과 같습니다. (1, 3)에서 (5, 8)로 드래그하면 모든 파일을 선택할 수 있으며 더 작은 드래그 거리로 모든 파일을 선택할 수 있는 방법이 없습니다. 따라서 가장 적은 드래그로 모든 파일을 선택하는 방법인 (1, 3, 5, 8)을 반환합니다.
-

I/O 예제 #3
- 예제 #3의 바탕 화면은 다음과 같습니다. 모든 파일을 선택하려면 바탕 화면의 왼쪽 상단(0, 0)에서 오른쪽 하단(7, 9)으로 드래그합니다. 따라서 (0, 0, 7, 9)를 반환합니다.
-

I/O 예제 #4
- 예제 데스크톱 #4에는 다음과 같이 행 2, 열 1에만 아이콘이 있습니다. 드래그하여 선택하려면 셀의 왼쪽 상단(1, 0)에서 오른쪽 하단(2, 1)으로 드래그합니다. (1, 0)에서 (2, 2)로 드래그하면 아이콘을 선택할 수 있지만 이전보다 이동 거리가 길어집니다. 따라서 (1, 0, 2, 1)을 반환합니다.
-

답변
class Solution {
public int() solution(String() wallpaper) {
int()() desktop = new int(wallpaper.length)(wallpaper(0).length());
int() result = new int(4);
for (int i = 0; i < wallpaper.length; i++) {
char() ch = wallpaper(i).toCharArray();
for (int j = 0; j < ch.length; j++) {
if (ch(j) == '.') desktop(i)(j) = 0;
else desktop(i)(j) = 1;
}
}
int min_x = Integer.MAX_VALUE;
int min_y = Integer.MAX_VALUE;
int max_x = Integer.MIN_VALUE;
int max_y = Integer.MIN_VALUE;
for (int i = 0; i < wallpaper.length; i++) {
for (int j = 0; j < wallpaper(i).length(); j++) {
if (desktop(i)(j) == 1) {
min_x = Math.min(min_x, i);
min_y = Math.min(min_y, j);
max_x = Math.max(max_x, i);
max_y = Math.max(max_y, j);
}
}
}
result(0) = min_x;
result(1) = min_y;
result(2) = max_x + 1;
result(3) = max_y + 1;
return result;
}
}
답변(리팩토링)
class Solution {
public int() solution(String() wallpaper) {
int()() desktop = new int(wallpaper.length)(wallpaper(0).length());
int() result = {51, 51, -1, -1};
for (int i = 0; i < wallpaper.length; i++) {
char() ch = wallpaper(i).toCharArray();
for (int j = 0; j < ch.length; j++) {
if (ch(j) == '.') desktop(i)(j) = 0;
else desktop(i)(j) = 1;
}
}
for (int i = 0; i < wallpaper.length; i++) {
for (int j = 0; j < wallpaper(i).length(); j++) {
if (desktop(i)(j) == 1) {
result(0) = Math.min(result(0), i);
result(1) = Math.min(result(1), j);
result(2) = Math.max(result(2), i+1);
result(3) = Math.max(result(3), j+1);
}
}
}
return result;
}
}
![]()
- 위 이미지에서 I/O #2를 예로 들면 모든 파일을 삭제하려면 (1, 3)에서 (5, 8)까지 드래그를 시작해야 합니다.
- 좌표(1, 3)는 가장 왼쪽 파일 중 x좌표에서 만나는 첫 번째 파일과 y좌표에서 만나는 첫 번째 파일의 조합이다.
- 좌표(5, 8)는 마지막 파일의 좌표 조합입니다.
- 다음은 Math.min 및 Math.max를 사용하여 처음 만나는 파일과 마지막으로 만나는 파일을 찾는 방법입니다!
- 이때 파일의 위치는 왼쪽 위 좌표를 기준으로 하므로 마지막 파일의 위치는 +1 좌표여야 합니다!


