본문 바로가기
알고리즘/백준

[백준 3987] 보이저 1호 (C++)

by Bloofer 2020. 9. 30.

A. 문제설명

www.acmicpc.net/problem/3987

 

3987번: 보이저 1호

첫째 줄에 시그널을 보내는 방향을 출력한다. (U: 위, R: 오른쪽, D: 아래, L: 왼쪽) 만약, 방향이 여러 가지가 존재한다면, U, R, D, L의 순서 중 앞서는 것을 출력한다. 둘째 줄에는 가장 긴 시간을 출�

www.acmicpc.net

문제에 대한 자세한 설명은 링크 참조

 

1. 아래와 같은 N*M 배열판이 존재

2. 배열 내 각 엔트리에는 C(블랙홀), .(빈 공간), / \(행성)이 각각 존재

3. 보이저 1호에서 처음 출발위치에서 시그널을 동서남북의 방향으로 보내 전파시키려고 함

4. 여기서, 시그널이 / \(행성)을 만나면 아래 그림과 같이 방향을 전환하게 됨

5. 그 외에 빈공간을 만나면 방향전환없이 이동하지만 C(블랙홀)이나 영역밖을 벗어나게 되면 전파를 종료함

6. 탐사선이 어느 방향으로 시그널을 보내면, 시그널이 항성계 내부에 있는 시간이 최대가 되는지 구하라

 

B. 접근법

시뮬레이션

 

보이저 1호의 시그널 전파 방향에 대하여, 4방향의 이동 시뮬레이션을 그대로 구현하면 되는 문제.

여기서 주의할 점은 시그널이 무한히 전파되는 경우를 찾아야 하는데, 같은 배열의 좌표를 두번 이상 같은 방향으로 방문했다면 Loop이 생긴다고 볼 수 있다. 이 점을 감안하여 visit 배열을 사용하여, 각 좌표내 해당 방향으로 방문되었는 지에 대한 정보를 기록하며 탐사하였다.

 

C. 풀이

1. 보이저 1호의 탐사 함수, 탐사선의 위치를 받아 최장 탐사시간을 탐색

2. 탐사선이 영역 바깥으로 나가거나 블랙홀에 빠지면 탐사종료

3. 탐사선이 같은 위치에 같은 방향으로 반복에 빠지면 Voyager!

4. 를 만날경우 다음 방향이 XOR 1한 결과가 됨

5. 를 만날경우 다음 방향이 3-ndir한 결과가 됨

6. 모든 탐사를 완료하고 최대 전파거리와 방향을 출력

 

D. 내 코드