<Lv.3> 공 이동 시뮬레이션 (프로그래머스 : C#)

이도희·2023년 9월 16일
0

알고리즘 문제 풀이

목록 보기
168/185

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에 도달할 수 있는 시작점의 개수 반환하기

  • Input
    행 개수 n, 열 개수 m, 정수 x와 y, 쿼리 목록 queries
  • Output
    nxm개의 가능한 시작점에 대해 해당 시작점에 공을 두고 queries 내의 쿼리 순서대로 시뮬레이션 후 x행 y열에 도착하는 시작점 개수 반환

예제


풀이

  1. 목표 지점에서부터 거꾸로 탐색을 이어나간다.
  2. 주어진 쿼리 방향을 거꾸로 탐색하기 때문에 반대 방향으로 잡고 각 좌표의 min과 max를 늘려 나간다. (여기서 min과 max가 테두리에 위치한게 아니면 둘 중 하나가 움직일 때 같이 움직여준다. => 중간에 있으면 특정 값 주어질 때 결국 길이 하나가 되기 때문에 같이 움직여야함)
  3. x, y 각 좌표에 대해 min과 max를 기반으로 계산된 사각형 넓이 만큼이 목표 지점에 도달할 수 있는 점의 개수
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;
    }
}

결과

profile
하나씩 심어 나가는 개발 농장🥕 (블로그 이전중)

0개의 댓글