티스토리 뷰
[문제]
[해설]
- 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};
- 바탕화면이 위의 그림과 같은 상태일 때 코드를 실행하면 각 변수와 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 을 해줘야한다.
'흥미 > 코딩테스트' 카테고리의 다른 글
😊 #18 프로그래머스 - 푸드 파이트 대회(Level 1) (0) | 2023.03.08 |
---|---|
😊 #17 프로그래머스 - 가장 가까운 같은 글자(Level 1) (0) | 2023.03.06 |
😊 #15 프로그래머스 - 저주의 숫자 3 (0) | 2023.02.28 |
😊 #14 프로그래머스 - 한 번만 등장한 문자 (0) | 2023.02.25 |
😊 #13 프로그래머스 - 숫자 찾기 / indexOf를 알아보자 (0) | 2023.02.19 |
- Total
- Today
- Yesterday
- Stream
- DART
- java
- API
- MongoDB
- Advanced Stream
- Spring Boot
- OS
- MySQL
- 프로그래머스
- 프로세스
- Phaser
- 알고리즘
- spring
- node.js
- jpa
- git
- 자료구조
- nosql
- 코테
- 빅데이터
- 메모리
- SQL
- Java8
- Phaser3
- 코딩테스트
- SpringBoot
- 빅데이터 분석기사
- 운영체제
- db
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |