dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 백준 DP
  • 스프링
  • BFS
  • c++
  • 회고
  • 서블릿
  • HackerRank mysql
  • 부스트캠프
  • 네이버 부스트캠프
  • Hackerrank
  • AI Tech
  • 그래프탐색
  • Baekjoon
  • 기록
  • 프로그래머스 SQL
  • 반성
  • 백준
  • 프로그래머스
  • 일기
  • dp

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 3190] 뱀 (덱, 시뮬레이션) (C++)

2021. 9. 21. 16:06
728x90

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

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

www.acmicpc.net

어렸을 때 해봤던 뱀 게임 문제이다.

 

뱀은 매 초마다

1. 머리를 방향에 따라 이동한다

2. 머리에 사과가 있다면 뱀의 길이는 하나 늘어난다. 즉, 꼬리 부분이 그대로 있다.

3. 사과가 없다면 한 칸 전진한 것이므로 꼬리 부분 역시 한 칸 이동한다.

 

명령어는 L(왼쪽)과 D(오른쪽)으로 구성되어 있으며, 게임 시작 시간으로부터 X초가 끝난 뒤에 실행된다.

 

따라서 1초마다 뱀의 머리를 방향에 맞춰 이동해주었고, 사과의 유무에 따라 꼬리를 조절해주었다.

여기서 deque를 이용해서 이동 시 뱀의 머리에 해당하는 x, y를 push_front 해주었고, 꼬리는 pop_back 해주었다.

뱀의 좌표는 deque로 저장해주고, 자신의 몸에 부딪치는 경우는 check배열을 이용해서 확인했다.

 

그리고 x초에 해야 할 일을 모두 끝내고, 명령어에 x초 방향 전환이 있다면 방향을 바꿔주었다.

그러면 다음 x+1초부터 바뀐 방향으로 뱀의 머리가 이동한다.

 

즉, 뱀은 항상 머리만 방향 따라 움직이게 하고, 꼬리만 조절해주도록 구현하면 된다. 

#include <iostream>
#include <vector>
#include <deque>

using namespace std;

int board[101][101], check[101][101], moveTo[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
int N, K, L, row, col, t;
char direction;
typedef pair<int, int> pii;
typedef pair<int, char> pic;
deque<pii> snake;
deque<pic> command;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> N >> K;
	for (int k = 0; k < K; k++) {
		cin >> row >> col;
		board[row][col] = -1; // 사과
	}
	cin >> L;
	for (int l = 0; l < L; l++) {
		cin >> t >> direction;
		command.push_back({ t, direction });
	}

	int x = 1, y = 1, d = 0, t = 0;
	snake.push_back({ x,y });
	check[x][y] = true;
	while (!snake.empty()) {
		t++; // 매초 증가
		// 머리 이동
		int nx = snake.front().first + moveTo[d][0];
		int ny = snake.front().second + moveTo[d][1];

		if (nx > N || ny > N || nx < 1 || ny < 1) { // 벽에 부딪치는 경우
			cout << t;
			break;
		}
		if (check[nx][ny]) { // 내 몸에 부딪치는 경우
			cout << t;
			break;
		}
		check[nx][ny] = true;
		snake.push_front({ nx,ny });

		if (board[nx][ny] == -1) { // 사과 발견
			board[nx][ny] = 0; // 먹고 지워주기
		}
		else { // 사과 없으면 꼬리 줄이기
			check[snake.back().first][snake.back().second] = false;
			snake.pop_back();
		}

		if (!command.empty()) {
			if (t == command.front().first) { // t초가 끝난 뒤에 회전하는 명령
				if (command.front().second == 'L') { // 왼쪽
					d = (d + 3) % 4;
				}
				else { // 오른쪽
					d = (d + 1) % 4;
				}
				command.pop_front();
			}
		}
	}
}
728x90
저작자표시 비영리 변경금지 (새창열림)

'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글

[baekjoon 14719] 빗물 (구현, 스택) (C++)  (0) 2021.09.24
[baekjoon 19951] 태상이의 훈련소 생활 (누적합) (C++)  (0) 2021.09.21
[baekjoon 2800] 괄호 제거 (스택, 구현, 재귀) (C++)  (0) 2021.09.20
[baekjoon 2696] 중앙값 구하기 (우선순위 큐) (C++)  (2) 2021.09.07
[baekjoon 12904] A와 B (문자열, 그리디) (C++)  (0) 2021.09.05
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 14719] 빗물 (구현, 스택) (C++)
    • [baekjoon 19951] 태상이의 훈련소 생활 (누적합) (C++)
    • [baekjoon 2800] 괄호 제거 (스택, 구현, 재귀) (C++)
    • [baekjoon 2696] 중앙값 구하기 (우선순위 큐) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바