반응형
포인트
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 |
댓글