[코드트리] dx dy technique / 거울에 레이저 쏘기 2

이정은·2024년 8월 20일

CODING TEST

목록 보기
2/4
post-thumbnail

🌞 문제


🌞 풀이

  1. map의 정보를 저장
    1-1. 이때 0으로 초기화된 arr[1001][1001]을 선언하여 (1,1) ~ (N,N) 까지 이용

  2. 레이저를 쏘는 위치 K를 결정하기 위해 K만큼 while 실행
    2-1. (1,0) 부터 시작하여 R 방향으로 한 칸씩 증가
    2-2. InRange 를 벗어나면 D 방향으로 한 칸씩 증가
    2-3. 같은 방식으로 한바퀴를 돌기 전에 K가 실행되는 위치 (x, y)를 구함

  3. K좌표에서 레이저 빛이 나가는 방향을 결정
    3-1. 앞서 (x, y)를 구할 때의 방향을 오른쪽으로 돌리면 K에서 레이저 빛이 나가는 방향이 됨

  4. 최대 n2 번 레이저 빛이 굴절될 수 있으므로, n2 번 while 문 반복
    4-1. arr[x][y]의 레이저 방향에 따라 방향 전환
    4-2. 방향대로 한칸씩 이동하며 cnt ++ 하다가 범위를 벗어나면 return 0;


🌞 작성코드

#include <iostream>
using namespace std;

//U, R, D, L
int dx[4]={-1, 0, 1, 0};
int dy[4]={0, 1, 0, -1};

int N, K;
int x=1, y=0, dir=1, cnt=0;
char arr[1001][1001];

bool InRange(int x, int y) {
    return (1<=x && x<=N && 1<=y && y<=N);
}

int main() {
    cin >> N;
    int max=2*N;

    for (int i=1; i<=N; i++) {
        for (int j=1; j<=N; j++) {
            cin >> arr[i][j];
        }
    }

    cin >> K;

    while(K>0) {
        K--;
        int r = x + dx[dir]; int c = y + dy[dir];
        if(InRange(r, c)) {
            x=r; y=c;
        } else {
            dir = (dir+1)%4;
        }
    }

    dir = (dir+1)%4;

    while (max>0) {
        max--;
        
        if(arr[x][y]=='/') {
            if (dir == 0) {
                dir = 1;
            } else if (dir == 1) {
                dir = 0;
            } else if (dir == 2) {
                dir = 3;
            } else {
                dir = 2;
            }
        } else {
            if (dir == 0) {
                dir = 3;
            } else if (dir == 1) {
                dir = 2;
            } else if (dir == 2) {
                dir = 1;
            } else {
                dir = 0;
            }
        }
        
        if (InRange(x, y)) {
            cnt++;
            x += dx[dir]; y += dy[dir];
        } else {
            cout << cnt;
            return 0;
        }
    }

    cout << cnt;

    return 0;
}

🌞 제출결과

profile
반나서 만갑습니다

0개의 댓글