티스토리 뷰

[문제]

출처 : https://school.programmers.co.kr
출처 : https://school.programmers.co.kr
출처 : https://school.programmers.co.kr
출처 : https://school.programmers.co.kr


[해설]

- Level 0 만 풀으니까 우물 안 개구리가 될 것 같다. 그래서 조금씩 Level 1 문제도 풀고자 한다.

- 당연히 못 풀었고 사실 문제를 풀 당시 지문과 예시를 다르게 이해했다.

(세로 좌표, 가로 좌표)
드래그의 시작점이 (lux, luy), 끝점이 (rdx, rdy)라면 정수 배열 [lux, luy, rdx, rdy]를 return

* 드래그의 시작점이 (lux, luy), 끝점이 (rdx, rdy) = 드래그의 시작점이 (세로, 가로), 끝점이 (세로, 가로)
* [lux, luy, rdx, rdy]를 return = [세로, 가로, 세로, 가로]를 return
------------------------------------------------------------------------------------------
- 위의 전제가 핵심인데 문제를 풀 당시 아래처럼 반대로 이해했다.
[lux, luy, rdx, rdy]를 return = [가로, 세로, 가로, 세로]를 return
- 뭐... 어차피 이해해도 못 풀었겠지만 어쨌든 문제를 이해하고 안 하고는 다른 차원의 얘기이니 주의하자

- 아래는 다른 사람의 풀이를 보고 작성한 코드이다.

class Solution {
    public int[] solution(String[] wallpaper) {
        int minX = 50; // 시작점(점 S) 좌표의 세로
        int minY = 50; // 시작점(점 S) 좌표의 가로
        
        int maxX = 0; // 종료점(점 E) 좌표의 세로
        int maxY = 0; // 종료점(점 E) 좌표의 가로

        for(int i = 0; i < wallpaper.length; i++ ){
            for(int j = 0; j < wallpaper[i].length(); j++){
                String tmp = wallpaper[i];
                if(tmp.indexOf("#") == -1) {
                    continue;
                } else if(wallpaper[i].charAt(j) == '#') {
                    minX = Math.min(minX,i); // 시작점(점 S) 좌표의 세로
                    minY = Math.min(minY,j); // 시작점(점 S) 좌표의 가로
                    
                    maxX = Math.max(maxX,i); // 종료점(점 E) 좌표의 세로
                    maxY = Math.max(maxY,j); // 종료점(점 E) 좌표의 가로
                }
            }
        }
        return new int[]{minX, minY, maxX+1, maxY+1};
    }
}

- 어차피 못 푼거 이해나 해보자

1. 왜 변수의 값을 이렇게 설정했나?

int minX = 50; // 시작점(점 S) 좌표의 세로
int minY = 50; // 시작점(점 S) 좌표의 가로
        
int maxX = 0; // 종료점(점 E) 좌표의 세로
int maxY = 0; // 종료점(점 E) 좌표의 가로

1-1. mixX와 minY

- mixX와 minY는 시작점(점 S)의 좌표를 나타내는 값이다.(바탕 화면의 좌측 상단이 시작점)

- mixX와 minY의 입장에서 최소값은 (0,0) / 최대값은 (50, 50)이다. 즉, 파일 위치의 가장 극단적인 경우는 (50, 50)이다.

- 그렇기에 가장 극단적인 경우인 (50, 50) 기본값으로 시작하여 Math.min() method를 이용해 (50, 50)보다 더 작은 값을 찾으면 해당 값을 mixX와 minY에 넣어주는 식으로 계산을 진행한다.

 

1-2. maxX와 maxY

- mixX, minY와 반대로 이해하면 된다.

- maxX와 maxY는 종료점(점 E)의 좌표를 나타내는 값이다.(바탕 화면의 우측 하단이 시작점)

- maxX와 maxY의 입장에서 최소값은 (50, 50) / 최대값은 (0,0)이다. 즉, 파일 위치의 가장 극단적인 경우는 (0, 0)이다.

- 그렇기에 가장 극단적인 경우인 (0, 0) 기본값으로 시작하여 Math.max() method를 이용해 (0, 0)보다 더 큰 값을 찾으면 해당 값을 maxX와 maxY에 넣어주는 식으로 계산을 진행한다.

 

2. 왜 +1 을 해주는가?

return new int[]{minX, minY, maxX+1, maxY+1};

출처 : https://school.programmers.co.kr

- 바탕화면이 위의 그림과 같은 상태일 때 코드를 실행하면 각 변수와 return 값은 아래와 같이 된다.

int minX = 1; // 시작점(점 S) 좌표의 세로
int minY = 3; // 시작점(점 S) 좌표의 가로
        
int maxX = 4; // 종료점(점 E) 좌표의 세로
int maxY = 7; // 종료점(점 E) 좌표의 가로

[1, 3, 4, 7]

- 그러나 실제 좌표는 아래이다.

시작점(점 S)  -->  (1, 3)
종료점(점 E)  -->  (5, 8)

- 그렇기에 maxX와 maxY에는 각각 +1 을 해줘야한다.

(세로 좌표, 가로 좌표)

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함