[BOJ][삼성기출] 3190. 뱀

gyeong·2021년 4월 17일
0

PS

목록 보기
31/46

문제 접근

  1. 시뮬레이션 문제
    문제에서 주어진 조건을 잘 이해하고 그대로 코딩하면 된다.

  2. 뱀이 한 칸 이동했을 때 빈칸이라면 몸 길이가 1 줄어든다. 이를 큐를 이용하여 구현하였다. 즉, 뱀이 지나온 좌표 (pair<int, int>)를 큐의 원소로 삼았다.
    뱀이 좌표를 이동할 때마다 Tail에 좌표 정보를 저장해야 한다.

  3. 문제를 풀며 조금 헷갈렸던 부분은 뱀이 방향을 바꾸는 시점과 게임이 종료되는 시점이다.
    핵심은 X초가 끝난 뒤에 방향을 회전시킨다는 거다. 현재 세팅된 방향으로 이동이 끝난 후, 현재 시점이 X초의 수행이 끝난 시점인지 확인한다.(Q.front().first == rst)
    X초가 지났고, 세팅할 다음 방향이 있는 경우(!Q.empty()) 다음 방향의 정보를 받아와 Dir 변수를 세팅한다.

  4. map 정보는 빈칸은 0, 사과는 1, 뱀은 2의 값을 사용하여 표현하였다.

풀이

#include <iostream>
#include <queue>
using namespace std;

int N, K, L, rst;
int map[101][101] = { 0, };
queue<pair<int, char>> Q;
queue<pair<int, int>> Tail;
int hx, hy, Dir;

int dx[] = { 0, -1, 0, 1 };
int dy[] = { 1, 0, -1, 0 };

void input() {
	cin >> N >> K;
	for (int i = 0; i < K; i++) {
		int x, y;
		cin >> x >> y;
		map[x][y] = 1; 
	}
	cin >> L;
	for (int i = 0; i < L; i++) {
		int sec;
		char dir;
		cin >> sec >> dir;
		Q.push(make_pair(sec, dir));
	}
	hx = 1; hy = 1; Dir = 0;
	map[hx][hy] = 2;
	Tail.push(make_pair(hx, hy));
}

int is_range(int x, int y) {
	if (x >= 1 && x <= N && y >= 1 && y <= N) return true;
	return false;
}

void solve() {
	while (true) {
		rst++;

		int nx = hx + dx[Dir];
		int ny = hy + dy[Dir];

		if (!is_range(nx, ny) || map[nx][ny] == 2) {
			break;
		}
			
		Tail.push(make_pair(nx, ny));

		if (map[nx][ny] == 1) { // apple
			hx = nx; hy = ny;
			map[hx][hy] = 2;
		}
		else if (map[nx][ny] == 0) { // no apple
			hx = nx; hy = ny;
			map[Tail.front().first][Tail.front().second] = 0;
			Tail.pop();
			map[hx][hy] = 2;
		}

		if (!Q.empty() && Q.front().first == rst) {
			if (Q.front().second == 'L') {
				Dir = Dir + 1;
				if (Dir > 3) Dir = 0;
			}
			else {
				Dir = Dir - 1;
				if (Dir < 0) Dir = 3;
			}
			Q.pop();
		}
	}
}

int main() {
	input();
	solve();
	cout << rst << endl;
}
profile
내가 보려고 만든 벨로그

0개의 댓글