본문 바로가기
알고리즘

[알고리즘] 뱀

by keel_im 2021. 3. 11.
반응형

포인트

1. 시뮬레이션 문제 -> 뱀 표시를 잘 해야 한다. 

2. 파이썬도 뱀의 한 종류 인데~~~🐍🐍🐍

🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다. 

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

using namespace std;

int n, k, l;
int map[100][100];

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

vector<pair<int, char>> vc;

int turn_direction(int d, char c) {
    if (c == 'L') {
        if (d == 0) return 3;
        else if (d == 1) return 2;
        else if (d == 2) return 0;
        else if (d == 3) return 1;
    } else if (c == 'D') {
        if (d == 0) return 2;
        else if (d == 1) return 3;
        else if (d == 2) return 1;
        else if (d == 3) return 0;
    }
}

int main() {
    cin >> n >> k;
    for (int i = 0; i < k; i++) {
        int x, y;
        cin >> x >> y;
        x = x - 1;
        y = y - 1;
        map[x][y] = 1;    // 사과 = 1로 표시
    }
    cin >> l;
    for (int i = 0; i < l; i++) {
        int a; char b;
        cin >> a >> b;
        vc.push_back({a, b});
    }

    deque<pair<int, int>> dq;
    int x = 0; int y = 0; int d = 0;
    int time = 0; int index = 0;
    dq.push_back({x, y});
    map[x][y] = 2;

    while (1) {
        time += 1;
        int nx = x + dx[d];
        int ny = y + dy[d];

        if ((nx < 0 || ny < 0 || nx >= n || ny >= n) || map[nx][ny] == 2) {
            break;
        } else if (map[nx][ny] == 0) {
            map[nx][ny] = 2;
            map[dq.back().first][dq.back().second] = 0;
            dq.pop_back();
            dq.push_front({nx, ny});
        } else if (map[nx][ny] == 1) {
            map[nx][ny] = 2;
            dq.push_front(make_pair(nx, ny));
        }

        if (index < vc.size()) {
            if (time == vc[index].first) {
                if (vc[index].second == 'L')
                    d = turn_direction(d, 'L');
                else if (vc[index].second == 'D') d = turn_direction(d, 'D');
                index+=1;
            }
        }

        x = nx;
        y = ny;
    }
    cout << time << '\n';

    return 0;
}

python

import sys
from collections import deque

sys.stdin = open('input.txt')

n = int(input())
k = int(input())

data = [[0] * n for _ in range(n)]

dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]

for _ in range(k):
	a, b = map(int, input().split())
	a -= 1
	b -= 1
	data[a][b] = 1

l = int(input())
commands = []

for _ in range(l):
	a, b = input().split()
	a = int(a)
	commands.append([a, b])


def turn(snake: int, dir: str) -> int:
	"""
	뱀의 방향의 따라서 방향을 새로 지정해주는 함수 
	:param snake:
	:param dir:
	:return:
	"""
	if dir == 'L':
		if snake == 3:
			return 0
		else:
			return snake + 1
	elif dir == 'D':
		if snake == 0:
			return 3
		else:
			return snake - 1


time = 0
head = [0, 0, 3]
data[0][0] = 2
snake = deque()
snake.append(head)

while True:
	time += 1
	x, y, dir = head
	
	nx = x + dx[dir]
	ny = y + dy[dir]
	if not (0 <= nx < n and 0 <= ny < n):
		# 벽을 만나거나
		break
	elif data[nx][ny] == 2:
		# 자기 자신을 만나면
		break
	elif data[nx][ny] == 0:
		# 사과가 없을 때
		data[nx][ny] = 2
		snake.append([nx, ny, dir])
		row, col, temp_dir = snake.popleft()
		data[row][col] = 0
		head = [nx, ny, dir]
	else:
		# 사과가 있을 때
		data[nx][ny] = 2
		snake.append([nx, ny, dir])
		head = [nx, ny, dir]
	
	if commands and time == commands[0][0]:
		head[2] = turn(dir, commands[0][1])
		commands.pop(0)

print(time)
반응형

'알고리즘' 카테고리의 다른 글

[알고리즘] 나무 재테크  (0) 2021.03.14
[알고리즘] 위장  (0) 2021.03.11
[알고리즘] 특이한 자석 + 톱니바퀴  (0) 2021.03.10
[알고리즘] 가장 먼 노드  (0) 2021.03.09
[알고리즘] 홈 방범 서비스  (0) 2021.03.08

댓글