[BOJ] 3190번 뱀(C++)

Alice·2023년 9월 5일
0

풀이 소요시간 : 45분

Vector 를 사용하여 수월하게 풀이 가능한 시뮬레이션 문제였다. 별 다른 알고리즘을 요구하지는 않았고, Vector 를 사용하여 뱀의 머리와 꼬리를 잘 저장해주면 문제없이 통과할 수 있다. 방향 전환의 경우 실수 안하도록 조심하자.


전체 코드

#include<iostream>
#include<queue>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;

int N, K, L;
int dx[4] = { 0, 1, 0, -1 };
int dy[4] = { 1, 0, -1, 0 };
int Map[101][101];
//오른, 아래, 왼, 위

vector<pair<int, char>> V;
vector<pair<int, int>> Snake;


int Change_Dir(int curr, char Dir) {
	if (curr == 0)
	{
		if (Dir == 'L') return 3; //위
		else if (Dir == 'D') return 1; //아래
	}
	else if (curr == 1)
	{
		if (Dir == 'L') return 0; //오른
		else if (Dir == 'D') return 2; //왼
	}
	else if (curr == 2)
	{
		if (Dir == 'L') return 1; //아래
		else if (Dir == 'D') return 3; //위
	}
	else if (curr == 3) 
	{
		if (Dir == 'L') return 2; // 왼
		else if (Dir == 'D') return 0; // 오른
	}
}


void Input() {
	cin >> N >> K;
	for (int i = 0; i < K; i++)
	{
		int x, y;
		cin >> x >> y;
		Map[x][y] = 2;
	}
	cin >> L;
	for (int i = 0; i < L; i++)
	{
		int time;
		char dir;
		cin >> time >> dir;
		V.push_back({ time, dir });
	}
}



int main() {
	Input();

	int Time = 1;
	int Dir = 0;
	
	Snake.push_back({ 1, 1 });

	while (true)
	{

		//1. 일단 머리를 늘린다

		//뱀의 머리 좌표
		int px = Snake[Snake.size() - 1].first;
		int py = Snake[Snake.size() - 1].second;

		//다음 이동 좌표
		int nx = px + dx[Dir];
		int ny = py + dy[Dir];

		//범위 초과 체크
		if (nx < 1 || ny < 1 || nx > N || ny > N)
		{
			cout << Time << '\n';
			break;
		}

		//본체 충돌 체크
		bool Flag = true;
		for (int i = 0; i < Snake.size(); i++)
		{
			if (nx == Snake[i].first && ny == Snake[i].second)
			{
				Flag = false;
				break;
			}
		}
		if (Flag == false)
		{
			cout << Time << '\n';
			break;
		}

		//머리 늘림
		Snake.push_back({ nx, ny });


		//2. 사과 체크

		if (Map[nx][ny] == 2)
		{
			Map[nx][ny] = 0;
		}
		else
		{
			Snake.erase(Snake.begin());
		}


		//3. 방향 전환

		if (!V.empty())
		{
			if (Time == V[0].first)
			{
				Dir = Change_Dir(Dir, V[0].second);
				V.erase(V.begin());
			}
		}

		// 4.시간 증가
		Time++;

	}
}
profile
SSAFY 11th

0개의 댓글