새소식

항해 99 TIL

99클럽 코테 스터디 27일차 TIL [시뮬레이션]

  • -

문제 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분

 

내일은 위상 정렬에 대하여 복습하고, 관련된 문제들을 풀이해보려 한다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.