


map의 정보를 저장
1-1. 이때 0으로 초기화된 arr[1001][1001]을 선언하여 (1,1) ~ (N,N) 까지 이용
레이저를 쏘는 위치 K를 결정하기 위해 K만큼 while 실행
2-1. (1,0) 부터 시작하여 R 방향으로 한 칸씩 증가
2-2. InRange 를 벗어나면 D 방향으로 한 칸씩 증가
2-3. 같은 방식으로 한바퀴를 돌기 전에 K가 실행되는 위치 (x, y)를 구함
K좌표에서 레이저 빛이 나가는 방향을 결정
3-1. 앞서 (x, y)를 구할 때의 방향을 오른쪽으로 돌리면 K에서 레이저 빛이 나가는 방향이 됨
최대 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;
}
