오늘의 학습 키워드
</> 시뮬레이션
공부한 내용 본인의 언어로 정리하기
class Solution {
public int[] solution(String[] wallpaper) {
// 초기값 설정:
// minRow와 minCol은 가능한 가장 큰 값으로 초기화
// 이는 발견된 # 문자의 행과 열 인덱스를 기준으로 최소값을 찾기 위함
int minRow = wallpaper.length; // 가장 위의 행 번호 초기값: 배열의 전체 행 수
int minCol = wallpaper[0].length(); // 가장 왼쪽 열 번호 초기값: 배열의 전체 열 수
int maxRow = -1; // 가장 아래 행 번호 초기값: 배열의 유효 인덱스보다 작음
int maxCol = -1; // 가장 오른쪽 열 번호 초기값: 배열의 유효 인덱스보다 작음
// 모든 칸을 탐색
for (int i = 0; i < wallpaper.length; i++) { // 각 행을 순회
for (int j = 0; j < wallpaper[i].length(); j++) { // 각 열을 순회
if (wallpaper[i].charAt(j) == '#') { // # 문자를 발견했을 때
// 현재 발견된 # 문자의 행 인덱스와 열 인덱스를 바탕으로 경계값 갱신
minRow = Math.min(minRow, i); // 현재까지 발견된 # 문자가 포함된 가장 위쪽 행
minCol = Math.min(minCol, j); // 현재까지 발견된 # 문자가 포함된 가장 왼쪽 열
maxRow = Math.max(maxRow, i); // 현재까지 발견된 # 문자가 포함된 가장 아래쪽 행
maxCol = Math.max(maxCol, j); // 현재까지 발견된 # 문자가 포함된 가장 오른쪽 열
}
}
}
// 최종적으로 발견된 # 문자가 포함된 영역의 경계값을 반환
// maxRow + 1 및 maxCol + 1은 인덱스 기준으로 영역의 크기를 포함하기 위해 사용
return new int[] {minRow, minCol, maxRow + 1, maxCol + 1};
}
}
오늘의 회고
오늘 문제는 각 행의 위치에 있는 파일들을 최소값으로 드래그해서 전체 선택을 할 수 있게 하는 문제였다.
그래서 나는 바탕화면 전체를 순회하면서 각 최소 최대값을 구해서 파일을 포함하는 위치의 값을 배열로 리턴 시켜주었다.
코드만 보면 min 과 max 때문에 헷갈릴수 있는데 전체 배열 크기에서 가장 낮은값과 높은값을 구해야하기 때문에 저렇게 표기한 것으로 코드를 제대로 읽고 이해를 해야한다.
일단 처음에 맨 끝과 맨 앞의 값을 초기화 시켜 주었다.
int minRow = wallpaper.length;
int minCol = wallpaper[0].length();
int maxRow = -1;
int maxCol = -1;
그리고 모든 칸을 순회시켜 확인해주었다.
for (int i = 0; i < wallpaper.length; i++) { // 각 행을 순회
for (int j = 0; j < wallpaper[i].length(); j++) { // 각 열을 순회
}
}
이제 안에서 찾아야 할 값들을 Math 메서드를 이용해서 구해주었다.
minRow = Math.min(minRow, i);
minCol = Math.min(minCol, j);
maxRow = Math.max(maxRow, i);
maxCol = Math.max(maxCol, j);
최종적으로는 구한 값들을 모두 배열로 출력시켜 주면 완성이 된다.
return new int[]{minRow,minCol,maxRow+1,maxCol+1};
+1을 해준 이유는 그대로 둘 경우 영역의 크기에 포함이 되지않고 한칸이 작게 되어 선택되지 않기 때문에 +1을 해주어서 파일이 선택되게끔 만들었다.
내일 공부할 것 :
시뮬레이션 관련 코드나 문제들을 찾아봐야 할 것 같다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/161990