알고리즘 공부/백준 문제풀이

[백준 python] 23288번 주사위 굴리기 2

이현찬 2022. 8. 15. 20:04
728x90

문제 링크

 

23288번: 주사위 굴리기 2

크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 가장 왼

www.acmicpc.net

문제 설명

  • 일정한 규칙에 따라 이동하는 주사위가 획득하는 점수를 계산하는 문제
  • 주사위 방향을 전환하는 규칙, 점수를 계산하는 규칙을 꼼꼼하게 읽고 풀이하면 어렵지 않게 풀 수 있는 문제

고민한 부분

  • 주사위의 상태를 나타내기 위한 방법을 고민했다. 다른 분들의 풀이를 보면 길이 6의 list로 만들어 index별로 의미를 부여해 문제를 해결했는데 나는 헷갈려서 각각의 위치에 해당하는 6개의 변수를 만들어 주사위를 modeling하는 것이 실수를 줄일 수 있는 방법이라고 생각했다. line 16부터 시작하는 roll method에서 각 변수 이름을 typing하는 것이 귀찮지만 실수 없이 한번에 해결할 수 있는 것이 더 좋다고 생각한다.
  • 계산하는 비용을 줄일 수 있는 방법을 고민했는데, 점수를 계산할 때 계산된 값은 그 과정에서 탐색된 table의 모든 element가 같은 값을 갖는다.
  • 예를 들어 위의 table에서 주사위가 (1,1)에서 (2,1)로 이동했을 때 계산되는 점수는 그 과정에서 탐색되는 모든 영역과 같은 값을 갖는다. 이를 활용해 문제 풀이 과정 중 중복되어 탐색되는 낭비를 방지할 수 있다.
    • line 127score_map을 정의해 계산된 점수를 기록해 이후에 주사위가 어떤 위치에 방문했을 때 활용한다.
    • 점수 계산을 수행하는 cal_score method에서 line 73에서 score_map을 참조해 이미 점수가 계산된 위치라면 탐색을 하기 전에 이를 참조해 점수를 반환하도록 풀이했다.
    • 이 정보를 활용하지 않고 풀이한 경우 780ms 시간에 소요된 반면 이를 활용해 중복 탐색을 줄인 경우 76ms이 소요된 것을 확인했다.

Lesson learned

  • 주사위 굴리기 1 문제를 해결한 후 다른 분들의 풀이를 보니 많은 분들이 주사위 modeling을 list로 했던 것을 확인했다. 이번 문제를 할 때 같은 방식으로 풀어보려 했지만 index가 헷갈려 실수를 반복했다.
  • 먼저 내가 익숙한 풀이로 풀이한 뒤 다른 사람들의 풀이 방식과 비교해 문제점이 없다면 그 방식을 유지하는 것도 괜찮을 것 같다고 생각을 했다. 그렇지만 혼자서 공부하는 입장에서 내 풀이가 문제가 있는지 알 수 있는 방법은 없는 것 같다.
  • 질문을 할 수 없는 상황에서 최선의 방법은 다른 분들의 코드를 이해하고 다시 짜보며 분석해보는 것이 도움이 될 것 같다.