tony9402
[백준 23288] 주사위 굴리기2 본문
학습 돌릴 거 돌리다가 무의식적으로 백준을 들어갔더니 새로운 문제가 쏟아졌다. 그중에 주사위 굴리기 2라는 제목을 보고 뭔가 삼성 기출인 거 같아서 한번 풀어봤다.
역시 주사위 전개도가 주어지고 이를 잘 돌려야하는 문제이다. 노가다로 할 수도 있겠지만....
이런 문제 같은경우는 인덱스를 잘 활용하면 좀 더 수월하고 실수 없이 풀 수 있다.
![]() |
![]() |
위 그림 중 왼쪽 그림은 주사위 전개도에서 각 면에 인덱스를 붙인 사진이고 오른쪽 사진은 각 면이 어떤 방향을 바라고 보고 있는지 적어놓은 것이다.
위 그림은 문제에서 주어진 주사위 전개도 모양이다. 이를 잘 이용해서 동서남북 방향으로 어떻게 변화하는지 체크를 한 후 코딩만 하면 된다. 아래 4개의 그림들은 위 전개도에서 동서남북 방향으로 이동했을 때 변화된 전개도의 사진들이다.
이런 방향으로 움직이는걸 인덱스로 표현하면 아래와 같다.
이런 식으로 인덱스 정보를 담아놓으면 아래와 같은 함수 하나로 주사위를 동서남북 돌리고 싶은 방향으로 돌릴 수 있다.
아래 설명도 요즘은 많이들 알고 있는 기법이겠지만 간단히 작성하고 넘어가려고 한다. 바로 4방향을 방향벡터로 표현하면 좀 더 간단한 코딩을 할 수 있다.
그리고 방향을 시계 방향 회전(dtr), 반시계 방향 회전(drtr)으로 방향을 나타내는 인덱스로 표현하면 쉽게 할 수 있다. 아래 그림은 문제 조건에 따라 시계 방향, 반시계 방향으로 돌리게 구현한 것이다.
전체적인 로직은 생각보다 간단하다. 하지만 이를 구현하는 것은 좀 귀찮다.. 아래는 전체적인 로직이다.
- 동서남북 방향으로 같은 숫자들이 있는 구간의 넓이 구하기 -> labeling (백준 2667번이랑 거의 같음)
- K번 동안 주사위 굴리기
2-1. 주사위가 바라보고 있는 방향으로 이동할 수 있는지 판단
2-2. 벽으로 막혀있다면 바라보고 있는 방향 뒤집기
2-3. 바라보고 있는 방향으로 굴리기
2-4. ans += 현재 위치에 있는 숫자와 전처리로 계산한 넓이 곱
2-5. 문제에 주사위 방향 돌리는 그대로 진행 - 답 출력
해당 문제의 태그는 아래와 같을 것 같다.
- 너비 우선 탐색
- 깊이 우선 탐색
- 그래프 탐색
- 구현
- 시뮬레이션
'알고리즘' 카테고리의 다른 글
[C언어] 한 줄 입력 받을 때 어떻게 써야 해요? (1) | 2021.10.17 |
---|