https://school.programmers.co.kr/learn/courses/30/lessons/87391
다음의 쿼리가 있다.
1. query(0, dx): 열 번호가 감소하는 방향으로 dx칸 이동
2. query(1, dx): 열 번호가 증가하는 방향으로 dx칸 이동
3. query(2, dx): 행 번호가 감소하는 방향으로 dx칸 이동
4. query(3, dx): 행 번호가 증가하는 방향으로 dx칸 이동
공을 쿼리들로 날리고자 한다. 공은 격자 밖으로 이동할 수 없으며, 목적지가 격자 밖이면 이동하다 멈추게 된다.
모든 칸을 시작점으로 두고 주어진 쿼리를 실행할 때 x,y에 도달할 수 있는 시작점의 개수 반환하기
using System;
using System.Collections.Generic;
public class Solution {
public long solution(int n, int m, int x, int y, int[,] queries) {
long answer = 0;
long curX = 0;
long curY = 0;
long xMax = x;
long xMin = x;
long yMax = y;
long yMin = y;
for(int i = queries.GetLength(0)-1; i >= 0; i--) // 도착 지점 기준 거꾸로 가기
{
int dir = queries[i,0];
int dist = queries[i,1];
// 왼쪽 (거꾸로 봐야하므로 오른쪽으로 간주)
if (dir == 0)
{
yMax += dist;
if(yMax >= m) yMax = m-1;
if(yMin != 0) yMin += dist;
}
// 오른쪽 (왼쪽)
else if (dir == 1)
{
yMin -= dist;
if(yMin < 0) yMin = 0;
if(yMax != m-1) yMax -= dist;
}
// 위 (아래)
else if (dir == 2)
{
xMax += dist;
if(xMax >= n) xMax = n-1;
if(xMin != 0) xMin += dist;
}
// 아래 (위)
else if (dir == 3)
{
xMin -= dist;
if(xMin < 0) xMin = 0;
if(xMax != n-1) xMax -= dist;
}
if (yMin >= m || yMax < 0 || xMin >= n || xMax < 0) return 0;
}
answer = (xMax - xMin + 1) * (yMax - yMin + 1);
return answer;
}
}