-
백준 3190번 뱀: C언어 풀이Programming/PS 2023. 10. 15. 03:47
백준 3190 뱀 문제의 C언어 해설입니다.
뱀을 덱 자료구조를 사용해 모델링하고, 타일의 상태와 뱀의 방향 전환을 구현하기 위한 전략을 설명합니다.전략
뱀을 덱으로 구성한다.
뱀이 이동 할 때마다 머리/꼬리에서 삽입/삭제가 발생한다.
따라서 뱀을 덱으로 구성하는 게 합리적이다.덱의 원소는 NxN 보드 위 타일을 가르키는 포인터로 두었다.
보드 위의 좌표(i, j)를 저장하는 것보다 직관적인것 같다.타일의 구성
타일은 다음과 같은 4가지 상태 중 하나를 갖는다.
- 평원: 아무것도 없는 기본 상태이다.
- 사과: 여기에는 사과가 놓여있다.
- 뱀: 여기에는 뱀이 놓여져있다.
- 공허: NxN 보드의 바깥 공간을 의미한다.
이를 전부 enum으로 정의하기로 한다.
여기서 굳이 4번, 공허 타일을 추가한 이유는 경계값 처리를 간단하게 하기 위함이다.
보드의 바깥에 닿았을 때 게임 오버가 되어야 하니까, 그냥 공허 타일에 도달하면 게임 오버가 되도록 하면 된다.
문제의 입력값이 1-based indexing으로 주어지기 때문에 입력값을 받는 것도 편리해진다.뱀의 회전 구현
뱀이 나아가는 방향을 오른쪽, 아래쪽, 왼쪽, 윗쪽 순서대로 0, 1, 2, 3 으로 정의한다.
이러면
우측 회전은 기존 방향을 +1
왼쪽 회전은 기존 방향을 -1 하는 것으로 구현 가능하다.3+1 = 4로 범위를 벗어나더라도 4로 나눠주면 된다.
회전의 가짓수가 2의 거듭제곱이기 떄문에 3과의 bitwise and 를 통해 빠르게 나머지를 구할 수도 있다.
코드