2021 카카오 채용연계형 인턴십 코딩 테스트 4번 미로 탈출
문제 설명
풀이 방법
해당 문제는 목적지까지의 최단 거리를 구하는 문제이므로 다익스트라 알고리즘으로 풀어야 한다.
그런데 함정을 밟을 경우 밟은 노드 주위의 방향이 모두 반대가 되므로 반대 방향의 노드를 다음 우선순위 큐에 넣어야 한다. 따라서 다음에 갈 노드가 반대방향 인지도 그래프에 넣어줘야 인식할 수 있기때문에 처음 그래프 배열에 노드위치와 isReverse의 값을 같이 넣어주었다.
그리고 우선순위 큐에는 경로를 거치는 과정마다 어느 함정이 발동되있는지 상태를 같이 넘겨줘야 하는데 문제 정보에 보면 최대 함정수는 10개라고 나와있다.
따라서 함정의 발동 경우수는 최대 2^10=1024 가지 이므로 해당 가짓수를 효율적인 연산과 메모리 제한을 피하기 위해 비트마스크 기법으로 넘겨주면 된다. (ex: 6개의 함정중 3번, 5번 함정이 발동되면 010100=20)
요약
- 그래프에 역방향 노드도 함께 저장한다.
- 다음 노드가 현재 상태에 따라 갈수 있을때만 우선순위 큐에 넣는다.
- 넣기 전에 다음 노드가 함정이라면 다음 상태에 해당 함정 비트를 토글한 뒤에 넣어준다.
- 우선순위 큐에서 꺼낼 때마다 목적지에 해당하는 노드면 결과값과 비교하여 최솟값을 넣어준다.
위의 2번과 3번 방식을 함수로 분리하여 최대한 함수형 프로그래밍으로 코드를 작성해봤다.
소스 코드
1 |
|