본문 바로가기
코테/구현

[C/C++] 백준 3190, 구현

by 상똥 2023. 2. 18.

3190번: 뱀 (acmicpc.net)

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

풀이

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,1,0,-1 };

int main() {
	int map[100][100] = { 0, };	//이동 가능한 곳을 0으로 저장
	vector<pair<int, char>> dir;
	int N, K, L, X, temp1, temp2;
	char C;
	cin >> N;
	cin >> K;
	for (int i = 0; i < K; i++) {
		cin >> temp1;
		cin >> temp2;
		map[temp1 - 1][temp2 - 1] = 2;	//사과가 있는 곳은 3
	}
	cin >> L;
	for (int i = 0; i < L; i++) {
		cin >> temp1;
		cin >> C;
		dir.push_back(make_pair(temp1, C));
	}
    //입력 완료

	vector<pair<int, int>> snake;	//뱀의 흔적을 저장할 좌표 (꼬리 줄이기용)
	int H = 1, row = 0, col = 0, sec = 0;
	map[row][col] = 1;	//뱀이 있는 곳은 1이므로 시작점map[0][0]=1
	snake.push_back(make_pair(row, col));	//뱀의 꼬리 위치 행=0, 열=0
	while (1) {
		if ((dir.size() > 0) && (dir[0].first == sec)) {	//움직여야 할 시간이면 방향부터 바꿈
			if (dir[0].second == 'D') {
				H++;
				H %= 4;
			}
			else {
				if (H == 0)
					H = 3;
				else
					H--;
			}
			dir.erase(dir.begin());	//움직인 시간과 방향 삭제 (sec==dir[0]을 기준으로 판단하므로)
		}
		sec++;	//시간 증가
		row += dr[H];	//행 좌표 이동
		col += dc[H];	//열 좌표 이동

		if ((row < 0) || (row > N - 1) || (col < 0) || (col > N - 1))	//범위 밖이면 break
			break;
		if (map[row][col] == 2) {	//사과가 있는 곳이면
			map[row][col] = 1;	//사과를 먹고 꼬리는 그대로
			snake.push_back(make_pair(row, col));	//후에 꼬리를 줄이기 위해 좌표 입력
		}
		else if (map[row][col] == 0) {	//사과도 없고 뱀의 몸도 없음
			map[row][col] = 1;	//머리 이동한 후
			snake.push_back(make_pair(row, col));	//흔적 저장
			map[snake[0].first][snake[0].second] = 0;	//꼬리 이동
			snake.erase(snake.begin());	//꼬리 줄이기
		}
		else
			break;
	}
	cout << sec;
}

풀이
* 이동할 때마다 머리를 먼저 늘이고 꼬리를 움직이기 때문에, 뱀의 꼬리가 있었지만 몸을 줄여 없어질 자리이더라도 머리가 먼저 들어가면 몸에 닿는다. 따라서 break.