728x90
코드 힌트:
- 문제 이해:
- mats 배열은 정사각형의 돗자리로 현재 공원에 놓을 수 있는 가장 큰 돗자리의 크기를 구하는데 사용하는 배열입니다.
- park는 n x m 크기의 공원 맵으로, 매트가 놓일 수 있는 빈 공간은 "-1"로 표시되어 있습니다. 매트는 "-1"로 표시된 빈 공간에만 놓일 수 있습니다.
- 목표는 "-1"로 표시된 빈 공간 중 가장 큰 매트가 들어갈 수 있는 위치를 찾는 것입니다.
- 매트 놓기:
- 각 빈 공간("-1")에서 매트가 들어갈 수 있는 가장 큰 크기를 찾는 것이 목표입니다.
- 공원 맵을 순회하면서 빈 공간이 나오면 그 위치를 기준으로 mats 배열에 있는 매트 크기 중 들어갈 수 있는 최대 크기를 찾습니다.
- 매트는 정사각형이므로 해당 위치에서 매트가 들어갈 수 있는지를 확인해야 합니다.
- 매트 크기 확인:
- 주어진 매트 크기가 해당 위치에서 공원 맵 경계를 넘지 않는지 확인하고, 그 안에 "-1"만 있는지 체크합니다.
- 해당 매트가 들어갈 수 있는지 여부를 파악을 해야합니다. 만약 매트 크기만큼의 영역이 모두 "-1"이면 그 매트는 들어갈 수 있습니다.
- 해당 여부는 2중 for문을 사용하였고 flag 변수를 선언하여 true, false로 확인했습니다.
- 효율성 고려:
- 매트 크기가 클수록 먼저 확인하여 가장 큰 매트를 먼저 놓을 수 있는지를 따집니다. 그러므로 mats 배열을 내림차순으로 순회합니다.
- 만약 가장 큰 매트 크기와 일치하는 매트가 놓였으면 바로 결과를 반환합니다.
- 예외 처리:
- 만약 매트가 놓일 수 없는 경우에는 결과 값이 -1로 유지됩니다.
- park 맵이 경계를 넘지 않도록 체크하며, 그 안에 "-1" 외의 값이 있을 경우 해당 매트는 놓일 수 없다는 의미입니다.
정답은 더보기 클릭
더보기
import java.util.*;
class Solution {
public int solution(int[] mats, String[][] park) {
// 결과값을 저장할 변수를 초기화
int result = -1;
// 매트를 크기순으로 정렬
Arrays.sort(mats);
int n = park.length; // 공원의 행 크기
int m = park[0].length; // 공원의 열 크기
// 공원의 모든 좌표를 탐색
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// 공원 좌표가 '-1'일 때, 해당 좌표에서 시작할 수 있는 가장 큰 매트 크기를 찾는다
if (park[i][j].equals("-1")) {
result = Math.max(getMaxSize(mats, park, i, j), result);
// 만약 가장 큰 매트가 놓여질 수 있다면 탐색을 종료하고 결과를 반환
if (result == mats[mats.length-1])
return result;
}
}
}
return result;
}
public int getMaxSize(int[] mats, String[][] park, int x, int y) {
// 현재 위치에서 가장 큰 매트 크기를 저장할 변수
int maxSize = -1;
int n = park.length; // 공원의 행 크기
int m = park[0].length; // 공원의 열 크기
// 가장 큰 매트 크기부터 작은 매트 크기까지 순차적으로 검사
for (int i = mats.length - 1; i >= 0; i--) {
int size = mats[i]; // 현재 검사 중인 매트의 크기
// 매트가 공원 범위를 벗어나면 검사하지 않는다
if (x + size - 1 >= n || y + size - 1 >= m)
continue;
boolean flag = true; // 매트를 놓을 수 있는지 여부를 저장할 플래그
// 매트를 놓을 범위의 공원 좌표를 검사
for (int j = x; j < x + size; j++) {
for (int k = y; k < y + size; k++) {
// 공원의 해당 좌표가 '-1'이 아닌 경우, 매트를 놓을 수 없다
if (!park[j][k].equals("-1")) {
flag = false;
break;
}
}
}
// 매트를 놓을 수 있는 경우, 해당 매트의 크기를 저장하고 종료
if (flag) {
maxSize = size;
break;
}
}
return maxSize; // 놓을 수 있는 가장 큰 매트 크기를 반환
}
}
728x90
'프로그래머스(Java) > Level 1' 카테고리의 다른 글
[프로그래머스] [PCCE 기출문제] 9번 / 지폐 접기 (0) | 2024.09.09 |
---|---|
[프로그래머스] [PCCP 기출문제] 1번 / 동영상 재생기 (3) | 2024.09.07 |
[프로그래머스] 성격 유형 검사하기 (0) | 2024.08.29 |
[프로그래머스] 바탕화면 정리 (0) | 2024.08.29 |
[프로그래머스] 개인정보 수집 유효기간 (0) | 2024.08.27 |