[BOJ3190] 뱀

2 분 소요

[BOJ3190] 뱀

문제 링크

문제 설명

  • 뱀은 맨좌측 맨위에 처음 위치하고 길이는 1에서 시작. 처음에 오른쪽부터 향한다.
  • 뱀은 매 초마다 이동하는 데 다음과 같은 규칙을 따른다.
    1. 뱀의 몸길이를 늘려 머리를 다음 칸에 위치시킨다.
    2. 이동한 칸에 사과가 있다면 사과를 먹고 꼬리는 움직이지 않는다.
    3. 이동한 칸에 사과가 없다면 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다.
  • 입력으로 주어지는 부분 중 뱀의 방향 변환 정보가 주어지는데, x초가 끝난 후에 왼쪽이나 오른쪽으로 방향을 회전하는 명령어를 입력한다.
  • 뱀은 머리가 자신의 몸에 닿거나 벽에 부딪히면 게임이 끝난다.
  • 게임이 몇 초에 끝나는지 출력하는 문제.

코드 리뷰

  • 단순 시뮬레이션 문제이다.
  • 나는 일단 보드 배열을 사과 유무, 방향, 그리고 뱀이 놓여있는 부분을 체크해주는 3가지 변수를 갖고있는 구조체를 만들어 선언하였다.
  • 그 후, 뱀의 머리와 꼬리의 좌표를 갖고있는 변수 2개를 선언하였다.
  • 1,1에서 시작하여, 1초 후 뱀의 머리가 향하는 곳이 배열 범위를 벗어나면 탈출 시켜주었고, 뱀의 머리가 향하는 곳의 배열 check 변수가 1일 경우 몸통에 부딪힌 것이기 때문에 탈출 시켜주었다.
  • 그 경우가 아닐 경우 뱀의 머리가 도착한 곳에 check 변수를 1로 바꿔준 후, 사과의 유무에 따라 조건을 나눴다. 사과가 없을 경우 꼬리를 다음 좌표로 이동시켜 주고 원래 꼬리가 있던 부분의 check 변수를 0으로 바꿔준다.
  • 사과가 있을 경우는 그 좌표의 사과를 삭제시켜준다.
  • 입력을 받을 시에 큐에 방향전환 정보를 입력해놓는다.(시간과 방향)
  • 그 후, 시간과 큐에있는 명령의 시간이 같을 경우, 뱀의 머리가 있는 좌표의 방향을 바꿔주고 큐를 pop해준다.
#include <iostream>
#include <queue>
#include <utility>
using namespace std;

typedef struct {
	int apple;
	int dir;
	int check;
}Board;

typedef struct {
	int r;
	int c;
}snake_info;

Board board[102][102];
queue <pair<int, char>> q;
snake_info head;
snake_info tail;
int dr[4] = { 0,1,0,-1 };
int dc[4] = { 1,0,-1,0 };
int N;

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> N;
	int K;
	cin >> K;
	while(K--){
		int r, c;
		cin >> r >> c;
		board[r][c].apple = 1;
	}
	int L;
	cin >> L;
	while (L--) {
		int t;
		char c;
		cin >> t >> c;
		q.push(make_pair(t, c));
	}
	int t = 0;
	board[1][1].apple = board[1][1].dir = 0;
	board[1][1].check = 1;
	tail.r = tail.c = head.r = head.c = 1;
	while (++t) {
		int rnext = head.r + dr[board[head.r][head.c].dir];
		int cnext = head.c + dc[board[head.r][head.c].dir];
		board[rnext][cnext].dir = board[head.r][head.c].dir;
		if (rnext < 1 || rnext> N || cnext < 1 || cnext > N) 
			break;
		if (board[rnext][cnext].check == 1) 
			break;
		board[rnext][cnext].check = 1;
		if (board[rnext][cnext].apple == 0) {
			head.r = rnext;
			head.c = cnext;
			int idx = board[tail.r][tail.c].dir;
			board[tail.r][tail.c].check = 0;
			tail.r = tail.r + dr[idx];
			tail.c = tail.c + dc[idx];
		}
		if(board[rnext][cnext].apple != 0){
			board[rnext][cnext].apple = 0;
			head.r = rnext;
			head.c = cnext;
		}
		if (!q.empty()) {
			if (q.front().first == t) {
				if (q.front().second == 'D') {
					if (board[head.r][head.c].dir == 3) 
						board[head.r][head.c].dir = 0;
					else 
						board[head.r][head.c].dir++;
					q.pop();
				}
				else {
					if (board[head.r][head.c].dir == 0) 
						board[head.r][head.c].dir = 3;
					else 
						board[head.r][head.c].dir--;
					q.pop();
				}
			}
		}
	}
	cout << t;
	return 0;
}

댓글남기기