문제 분석
바탕화면의 칸은 (1,1) ~ (5,4) 구분되며, 드래그 할 격자점은 (0,0) ~ (6,5)로 구분된다.
"칸"을 기준으로 이중 for문을 돌다가 #(파일)이 나올때 마다 드래그 최소 시작 지점과 드래그가 끝나는 최소 지점을 계산
드래그를 시작하는 최소 시작 지점의 행과 열 : startDragRow, startDragCol
드래그가 끝나는 최소 지점의 행과 열 : endDragRow, endDragCol
파일이 나올때 마다 4가지 변수와 비교해서 최소 지점을 갱신한다.
Java 코드
static public int[] solution(String[] wallpaper) {
int[] answer = {};
// 드래그 최소 시작 지점
int startDragRow = Integer.MAX_VALUE;
int startDragCol = Integer.MAX_VALUE;
// 드래그 최소 끝 지점
int endDragRow = Integer.MIN_VALUE;
int endDragCol = Integer.MIN_VALUE;
for(int i=0;i<wallpaper.length;i++){
for(int j=0;j<wallpaper[i].length();j++){
if(wallpaper[i].charAt(j) == '#'){
if(i<startDragRow) startDragRow = i;
if(j<startDragCol) startDragCol = j;
if(i>endDragRow) endDragRow = i;
if(j>endDragCol) endDragCol = j;
}
}
}
answer = new int[] {startDragRow, startDragCol, endDragRow+1, endDragCol+1};
return answer;
}
최소값을 설정할 때(드래그 최소 시작 지점)의 초기값을 int가 가질 수 있는 수에서 가장 큰 값으로 설정하면, 처음에 #을 발견했을 때 그 위치의 인덱스는 "Integer.MAX_VALUE"보다 무조건 작기 때문에 최소값이 갱신된다.
(단, 바탕화면의 길이가 int 최대 범위인 2,147,483,647억을 초과하는 경우에는 "Integer.MAX_VALUE"로 초기값을 설정하면 안된다. 만약에 #의 위치가 22억인 경우 갱신되지 않기 때문에 문제에서 주어진 조건을 보고 초기값을 세팅해야 됨)
그러나 문제에서 "바탕화면"의 행과 열의 최대 길이는 50이기 때문에 초기에 최소값을 51으로 설정해도 무방하다.
최대 51*51 행렬이 있다고 가정했을 때, 50번째 인덱스가 가장 크기 때문에 파일이 [50] 인덱스에 있는 경우 최솟값은 초기에 설정한 51보다 작기 때문에 갱신된다.
파일이 하나만 있는 경우는 드래그의 시작점과 끝점이 같아진다.
무조건 시작점은 끝점보다 작아야 하기 때문에 끝점의 각 행과 열에 +1을 해준다.
여기서 주의해야 될 점은 #이 배열에 저장되어 있는 곳을 찾기 위해서는 인덱스 방식을 통해 접근하기 때문에 배열의 제일 처음 위치는 (0,0)부터 시작한다. 그러나 출력값은 1행 1열 단위로 시작하기 때문에 다음과 같이 변경해야 한다.
인덱스 기준 출력 값 : 드래그 시작 위치(0,0) ~ 드래그 종료 위치(1,2)
행렬 변환 후 출력 값 : 드래그 시작 위치(0,0) ~ 드래그 종료 위치(2,3)
드래그 시작 위치도 +1을 해야 되지 않을까 생각하는 분도 계실텐데 시작점이 증가 되면 파일을 포함하지 못하기 때문에 드래그 종료 위치만 1증가 시켜준다.
'알고리즘&자료구조 > ETC' 카테고리의 다른 글
백준 - 15683 (1) | 2024.06.07 |
---|---|
프로그래머스 - k진수에서 소수 개수 구하기 (1) | 2024.06.06 |
프로그래머스 - 주차 요금 계산 (1) | 2024.06.05 |