[문제 이름 : 공 이동 시뮬레이션 (프로그래머스, Lv 3) ]
문제 url : https://school.programmers.co.kr/learn/courses/30/lessons/87391
내가 작성한 코드는 아래와 같다.
풀이 과정을 떠올린 방법은 아래와 같다.
1. 입력된 날짜와 약관 정보를 숫자로 변환하고, 이를 Map에 저장한다.
2. 각 개인정보에 대해 유효기간을 계산하고, 오늘 날짜와 비교해 파기 대상을 구한다.
3. 파기 대상인 개인정보의 번호를 배열로 반환한다
public class Solution {
public long solution(int n, int m, int x, int y, int[][] queries) {
long startRow = x, endRow = x;
long startCol = y, endCol = y;
// 쿼리를 역순으로 처리
for (int i = queries.length - 1; i >= 0; i--) {
int direction = queries[i][0];
int distance = queries[i][1];
if (direction == 0) { // 왼쪽 이동 (열 감소)
endCol = Math.min(m - 1, endCol + distance);
if (startCol != 0) startCol += distance;
} else if (direction == 1) { // 오른쪽 이동 (열 증가)
startCol = Math.max(0, startCol - distance);
if (endCol != m - 1) endCol -= distance;
} else if (direction == 2) { // 위로 이동 (행 감소)
endRow = Math.min(n - 1, endRow + distance);
if (startRow != 0) startRow += distance;
} else if (direction == 3) { // 아래로 이동 (행 증가)
startRow = Math.max(0, startRow - distance);
if (endRow != n - 1) endRow -= distance;
}
// 범위가 유효하지 않다면 0을 반환
if (startRow > endRow || startCol > endCol) return 0;
}
// 남아있는 시작점의 개수 계산
return (endRow - startRow + 1) * (endCol - startCol + 1);
}
}
[풀이 과정]
1. 코드의 첫 부분에서 startRow, endRow, startCol, endCol 변수를 현재 공의 위치(x, y)로 초기화한다. 이는 쿼리를 역순으로 처리하면서 공이 도달할 수 있는 가능한 시작 범위를 추적하기 위해 사용된다.
2. queries 배열을 역순으로 순회하면서 쿼리를 처리한다.
3, 쿼리를 처리하면서 startRow, endRow, startCol, endCol를 조정하여 공이 도달할 수 있는 범위를 계산한다.
-
- 왼쪽 이동 (direction == 0):
- endCol을 증가시키고, startCol이 0이 아닐 때만 startCol을 증가시켜 조정한다.
- 오른쪽 이동 (direction == 1):
- startCol을 감소시키고, endCol이 m-1이 아닐 때만 endCol을 감소시켜 조정한다.
- 위로 이동 (direction == 2):
- endRow을 증가시키고, startRow이 0이 아닐 때만 startRow을 증가시켜 조정한다.
- 아래로 이동 (direction == 3):
- startRow을 감소시키고, endRow가 n-1이 아닐 때만 endRow을 감소시켜 조정한다.
- 각 쿼리 처리 후, startRow가 endRow보다 크거나 startCol이 endCol보다 크다면 공이 도달할 수 있는 범위가 없어진 것이므로 0을 반환하고 종료한다.
3. 결과 계산:
- 모든 쿼리 처리가 끝난 후, startRow에서 endRow까지와 startCol에서 endCol까지의 가능한 시작 위치의 수를 계산한다.
- 이는 startRow에서 endRow까지의 행의 개수와 startCol에서 endCol까지의 열의 개수를 곱한 값을 의미한다.
풀이 시간 : 30분