코딩테스트/문제풀이

[코드트리] 작은 구슬의 이동

알렉스 페레이라 2023. 4. 20. 11:04

배열안에서 방향대로 이동하면서 벽에 부딪히면 방향을 전환하는 문제다. 행열 값이 0123이 아니라 1234로 들어와서 좀 헷갈렸는데 풀었다. 내가 지금 한발자국 더 가면 벽인지랑, 그 안에 범위안에 있는지에 대한 메소드로 두번 검증해야한다.

그리고 변수가 많아지다 보니 헷갈린다,, 지역변수랑 전역변수 이름을 최대한 다르게 해야겠다.

 

 

1개의 구슬이 n*n 격자 안에 놓여져 있고, 격자는 벽으로 둘러싸여 있습니다. 이 구슬은 방향을 갖고 있고, 해당 방향으로 1초에 한칸 씩 움직입니다.

 

구슬이 벽에 부딪히면 움직이는 방향이 반대로 뒤집혀 동일한 속도로 움직이는 것을 반복합니다. 이때 방향을 바꾸는 데에는 시간이 1만큼 소요됩니다.

처음 주어진 그림을 예로 4초 뒤까지의 모습을 순서대로 그려보면 다음과 같습니다.

구슬의 처음 위치와 초기 방향이 주어졌을 때, t초가 지난 이후에 해당 구슬의 위치를 구하는 프로그램을 작성해보세요.

 

입력 형식

첫 번째 줄에는 격자의 크기를 나타내는 n과 시간 t가 공백을 사이에 두고 주어집니다.

두 번째 줄에는 구슬 정보 (r, c, d)가 공백을 사이에 두고 주어집니다. 현재 구슬이 r행 c열에 놓여 있으며, d방향을 바라보고 있음을 뜻합니다. d는 위 아래 오른쪽 왼쪽을 의미하는 ‘U', ‘D’, ‘R’, 'L’ 4개의 문자 중 하나가 주어집니다. (1 ≤ r ≤ n, 1 ≤ c ≤ n)

  • 2 ≤ n ≤ 50
  • 1 ≤ t ≤ 100

 

출력 형식

t초 후 구슬의 위치가 r행 c열이라 했을 때 r, c 값을 공백을 사이에 두고 출력합니다.

 

입출력 예제

예제1

입력:

4 4
1 2 L

 

출력:

1 3

 

 

내 코드

import java.util.*;

public class Main {
    static final int[] dx = new int[]{-1, 0, 0, 1}; //서로 대칭되게 배열한다. ex)(0,3), (1,2)
    static final int[] dy = new int[]{0, 1, -1, 0};
    static int n; //격자 크기
    static int t; //시간
    static int r; //행
    static int c; //열
    static int d; //방향

    static int getDirection(String direction){
        switch(direction){
            case "U":
                return 0;
            case "D":
                return 3;
            case "R":
                return 1;
            case "L":
                return 2;
            default:
                return -1;
        }

    }

    static boolean inRange(int r, int c) {
        return r > 0 && r <= n && c > 0 && c <= n;
    }

    static boolean isEdge(int r, int c, int direction){
        if(inRange(r+dx[direction], c+dy[direction])){
            return false;
        }else{
            return true;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        t = sc.nextInt();
        r = sc.nextInt();
        c = sc.nextInt();
        d = getDirection(sc.next());

        for(int i = 0; i < t; i++){
            if(isEdge(r,c,d)){ //지금 방향대로 갔을때 벽이라면
                d = 3-direction; //방향만 바꿔준다.
                continue;
            }else{
                r += dx[d];
                c += dy[d];
            }
        }

        System.out.print(String.format("%d %d", r, c));
    }
}