오늘의 학습 키워드
- 문자열 배열
- 2차원 배열 순회
- 최소/최대값 갱신
- 드래그 범위 계산
- 좌표 계산
- 구현
공부한 내용 정리
오늘은 프로그래머스의 “바탕화면 정리” 문제를 풀었다.
이 문제는 바탕화면의 파일(#)들을 모두 드래그해서 선택하려고 할 때, 가장 효율적인 드래그 범위를 계산하는 구현 문제다.
핵심은 파일이 위치한 모든 좌표들을 순회하면서,
- 가장 위쪽(lux),
- 가장 왼쪽(luy),
- 가장 아래쪽(rdx),
- 가장 오른쪽(rdy)
을 각각 구한 뒤, 사각형 범위로 감싸는 것이다.
드래그는 좌상단 포함, 우하단은 다음 칸까지 포함해야 하기 때문에 rdx + 1, rdy + 1 처리가 필요하다.
이를 통해 [lux, luy, rdx+1, rdy+1]을 반환하면 정답이다.
소스코드
class Solution {
public int[] solution(String[] wallpaper) {
// 최소 값 구히기 : lux, luy 는 최대값으로
int lux = Integer.MAX_VALUE;
int luy = Integer.MAX_VALUE;
// 최대 값 구하기 : rdx, rdy 는 최소값으로
int rdx = Integer.MIN_VALUE;
int rdy = Integer.MIN_VALUE;
// 바탕화면 한칸씩 스캔
for(int i = 0; i < wallpaper.length; i++){
// 바탕화면 첫 번째 줄 확인
for (int j = 0; j < wallpaper[0].length(); j++){
// 만약 파일이 있는 위치라면
if (wallpaper[i].charAt(j) == '#'){
// 가장 작은 행/열 갱신 = 드래그 시작점
lux = Math.min(lux, i);
luy = Math.min(luy, j);
// 가장 큰 행/열 갱신 = 드래그 끝점
rdx = Math.max(rdx, i);
rdy = Math.max(rdy, j);
}
}
}
// 드래그는 오른쪽 아래 점까지 포함 안 되기 때문에 +1
return new int[]{lux, luy, rdx + 1, rdy + 1};
}
}
오늘의 회고
• 어떤 문제가 있었고, 나는 어떤 시도를 했는지
처음에는 드래그 거리 계산 기준이 애매해서 (rdx, rdy) 범위 설정에 혼동이 있었다.
또한, 시작점과 끝점이 좌상단/우하단으로 고정된다는 점을 놓쳐서 예외 처리에 주의가 필요했다.
• 어떻게 해결했는지
파일이 있는 좌표마다 최소값/최대값을 갱신하면서 좌상단과 우하단 좌표를 정확히 추적했고,
끝점은 포함되지 않으므로 +1을 해줘야 한다는 조건을 꼼꼼히 반영했다.
• 무엇을 새롭게 알았는지
- 2차원 좌표 문제에서는 min/max 갱신 방식이 매우 유용하다는 걸 체감했다.
- 드래그 거리 계산에서 포함/비포함의 기준이 실제 구현에 큰 영향을 줄 수 있다는 점도 중요했다.
- Java에서 좌표 계산 시 Integer.MAX_VALUE, Integer.MIN_VALUE를 초기값으로 쓰면 오류 없이 범위를 구할 수 있다.
• 내일 학습할 것은 무엇인지
내일은 BFS/DFS 탐색이 포함된 2차원 배열 문제를 풀어보며, 본격적인 탐색 알고리즘을 Java에서 구현하는 연습을 할 예정이다.
'99클럽 > 6기' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL - 섬의 개수 (백준 4963번) (0) | 2025.04.07 |
---|---|
99클럽 코테 스터디 5일차 TIL - 수열 (백준 2559번) (0) | 2025.04.04 |
99클럽 코테 스터디 4일차 TIL - 안전영역 (백준 2468번) (0) | 2025.04.03 |
99클럽 코테 스터디 2일차 TIL - 피보나치 비스무리한 수열 (백준 14495번) (0) | 2025.04.01 |
99클럽 코테 스터디 1일차 TIL - 소수 구하기 (백준 1929번) (1) | 2025.03.31 |