[프로그래머스] 공 이동 시뮬레이션 (JAVA)

유존돌돌이·2022년 1월 13일
0

Programmers

목록 보기
142/167
post-thumbnail

문제 설명

n행 m열의 격자가 있습니다. 격자의 각 행은 0, 1, ..., n-1번의 번호, 그리고 각 열은 0, 1, ..., m-1번의 번호가 순서대로 매겨져 있습니다. 당신은 이 격자에 공을 하나 두고, 그 공에 다음과 같은 쿼리들을 날리고자 합니다.

열 번호가 감소하는 방향으로 dx칸 이동하는 쿼리 (query(0, dx))
열 번호가 증가하는 방향으로 dx칸 이동하는 쿼리 (query(1, dx))
행 번호가 감소하는 방향으로 dx칸 이동하는 쿼리 (query(2, dx))
행 번호가 증가하는 방향으로 dx칸 이동하는 쿼리 (query(3, dx))
단, 공은 격자 바깥으로 이동할 수 없으며, 목적지가 격자 바깥인 경우 공은 이동하다가 더 이상 이동할 수 없을 때 멈추게 됩니다. 예를 들어, 5행 × 4열 크기의 격자 내의 공이 3행 2열에 있을 때 query(3, 10) 쿼리를 받은 경우 공은 4행 2열에서 멈추게 됩니다. (격자의 크기가 5행 × 4열이므로, 0~4번 행과 0~3번 열로 격자가 구성되기 때문입니다.)

격자의 행의 개수 n, 열의 개수 m, 정수 x와 y, 그리고 쿼리들의 목록을 나타내는 2차원 정수 배열 queries가 매개변수로 주어집니다. n × m개의 가능한 시작점에 대해서 해당 시작점에 공을 두고 queries 내의 쿼리들을 순서대로 시뮬레이션했을 때, x행 y열에 도착하는 시작점의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

1 ≤ n ≤ 109
1 ≤ m ≤ 109
0 ≤ x < n
0 ≤ y < m
1 ≤ queries의 행의 개수 ≤ 200,000
queries의 각 행은 [command,dx] 두 정수로 이루어져 있습니다.
0 ≤ command ≤ 3
1 ≤ dx ≤ 109
이는 query(command, dx)를 의미합니다.

Code

class Solution {
    public long solution(int n, int m, int x, int y, int[][] queries) {
        long rs=x, re=x, cs=y, ce=y;
		for(int i=queries.length-1 ; i>=0 ; i--) {
			int way=queries[i][0], step=queries[i][1];
			
			if(way==0) {
				// L
				if(cs>0) cs += step;
				ce = Math.min(m-1, ce+step);
				
			} else if(way==1) {
				// R
				if(ce<m-1) ce -= step;
				cs = Math.max(0, cs-step);
				
			} else if(way==2) {
				// U
				if(rs>0) rs += step;
				re = Math.min(n-1, re+step);

			} else {
				// D
				if(re<n-1) re -= step;
				rs = Math.max(0, rs-step);
			}
			if(rs>=n || re<0 || cs>=m || ce<0) return 0;	
		}
		return (re-rs+1)*(ce-cs+1);
    }
}

Comment

1트

long[][] 선언해서 하려했지만 역시나 range가 10^9다 보니 OOM 발생

2트

각 좌표별로 이동시켜서 구하려고 했는데, 이것도 역시나 range가 10^9다 보니 시간초과 발생

3트

하루를 꼬박 고민했는데, 도저히 방법이 안떠올라서 질문하기에서 다른분의 힌트를 받고
거꾸로 접근해보라는 도움으로 진행하여 통과했다. 발생의 전환이 필요하다.

0개의 댓글