✔ 바탕화면 정리
문제 분석하기
S(가장 왼쪽, 가장 위쪽), E(가장 오른쪽, 가장 아래쪽)로 드래그 해야하므로 가장 왼쪽, 오른쪽, 아래쪽, 위쪽의 좌표를 구하도록 함
손으로 풀어보기
- 바탕화면 저장
- 반복문으로 가장 왼쪽, 위쪽, 오른쪽, 아래쪽을 구함
- 가장 왼쪽 : #가 가장 처음으로 나온(작은) wallpaper
- 가장 위쪽 : #가 가장 처음으로 나온(작은) wallpaper[i]
- 가장 오른쪽 : #가 가장 마지막으로 나온(큰) wallpaper + 1
- 가장 아래쪽 : #가 가장 마지막으로 나온(큰) wallpaper[i] + 1
- 좌표 리턴
슈도코드 작성하기
wallpaper(바탕화면의 칸의 상태를 나타내는 문자열 배열)
lux, luy(드래그 시작점 좌표)
rdx, rdy(드래그 끝점 좌표)
for(wallpaper 만큼) {
lux : #가 가장 처음으로 나온(작은) wallpaper
luy : #가 가장 처음으로 나온(작은) wallpaper[i]
rdx : #가 가장 마지막으로 나온(큰) wallpaper
rdy : #가 가장 마지막으로 나온(큰) wallpaper[i]
}
좌표 lux, luy, rdx + 1, rdy + 1 리턴
코드 구현하기
/**
* 161990) 바탕화면_정리
*/
public class L074_161990 {
// wallpaper(바탕화면의 칸의 상태를 나타내는 문자열 배열)
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 : #가 가장 처음으로 나온(작은) wallpaper
lux = Math.min(lux, i);
// luy : #가 가장 처음으로 나온(작은) wallpaper[i]
luy = Math.min(luy, j);
// rdx : #가 가장 마지막으로 나온(큰) wallpaper
rdx = Math.max(rdx, i);
// rdy : #가 가장 마지막으로 나온(큰) wallpaper[i]
rdy = Math.max(rdy, j);
}
}
}
// 좌표 lux, luy, rdx + 1, rdy + 1 리턴
// #가 나온 좌표의 가장 우측 아래쪽을 리턴해야 하므로 + 1
int[] answer = { lux, luy, rdx + 1, rdy + 1 };
return answer;
}
// 테스트 케이스
public static void main(String[] args) {
L074_161990 solution = new L074_161990();
String[] wallpaper = { ".#...", "..#..", "...#." };
int[] result = solution.solution(wallpaper);
System.out.println(Arrays.toString(result));
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[160586] 대충 만든 자판 (0) | 2023.10.21 |
---|---|
[161989] 덧칠하기 (0) | 2023.10.20 |
[172928] 공원 산책 (0) | 2023.10.18 |
[176963] 추억 점수 (0) | 2023.10.17 |
[178871] 달리기 경주 (0) | 2023.10.16 |