1시간 정도 풀이하다 해결하지 못해 답을 찾아보았다. 이중 배열을 이용하고 특정 인덱스에 조건을 달아 문제를 해결해야 한다는 생각이 들고 그래프 이론을 생각하였다.
하지만 "뱀이 자유분방하게 이동한다." 라는 말이 없었고 처음에 오른쪽을 향한다는 지문을 통해 "뱀의 이동방향은 한쪽으로 고정되어 있고 특정 조건을 만났을때만 회전하나?" 라는 생각이 들어 위의 생각으로 풀이를 해보았다.
정답에는 근접한 풀이같았지만 결국 완벽한 답은 얻지 못하였다. 여러 정답들을 보고 풀이를 이어나갈 생각이다.
#include <iostream>
#include <queue>
using namespace std;
int main(){
int n, t1, t2 , k;
int map[102][102] = {0};
bool visit[102][102] = {false};
cin >> n;
cin >> k;
for (int i = 0; i < k; i++){
cin >> t1 >> t2;
map[t1 - 1][t2 - 1] = 1;
} // 문제에서 원점을 1,1을 기준으로 하고 있고 나는 0,0을 원점으로 하기위해서 -1해줌.
int cnt = 0;
char t3;
int dx[4] = {1, 0, -1, 0}; // 우, 하, 좌, 상
int dy[4] = {0, 1, 0, -1};
int dir = 0;
int x = 0;
int y = 0;
queue<pair<int, int>> q;
q.push(make_pair(x, y));
int bt1 = 0;
int l;
cin >> l;
for (int i = 0; i < l;i++){
cin >> t1 >> t3;
while(cnt < t1 || i == l-1){
// 마지막 입력까지 게임이 끝나지 않을 경우 뱀을 끝날때까지 보내줘야함.
cnt++;
int nx = x + dx[dir];
int ny = y + dy[dir];
if(nx >=0 && ny >=0 && nx<n && ny<n && !visit[ny][nx]){
// 게임이 끝나지 않을 조건
if(map[ny][nx] == 1){ // 사과를 먹었을 때
map[ny][nx] = 0; // 사과 없애주고
q.push(make_pair(nx, ny)); // 몸 좌표에 추가
visit[ny][nx] = true; // 몸 있다는걸 좌표 표시
}else{// 사과 없을 때
q.push(make_pair(nx, ny));
visit[ny][nx] = true;
visit[q.front().second][q.front().first] = false;
// 꼬리 부분없애주기
q.pop();
}
}else{
cout << cnt;
return 0;
}
x = nx;
y = ny;
if(cnt == t1){
if(t3 == 'D'){ // 우측 회전
dir = (dir + 1) % 4;
}else{ // 좌측 회전
dir = (dir + 3) % 4;
}
}
}
}
return 0;
} // 1h
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define endl "\n"
using namespace std;
int n, k, l;
int result = 1;
bool board[101][101] = { false };
bool apple[101][101] = { false };
queue<pair<int, int>> v;
void input() {
cin >> n;
cin >> k;
for (int i = 0; i < k; i++) {
int a, b;
cin >> a >> b;
apple[a][b] = false;
}
cin >> l;
for (int i = 0; i < l; i++) {
int a;
char b;
cin >> a >> b;
v.push({ a,b });
}
}
/*
먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
만약 벽이나 자기자신의 몸과 부딪히면 게임이 끝난다.
만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.
*/
//L 왼쪽 D 오른쪽
// 1상 2하 3좌 4우
void solve() {
int bam = 1;
int move = 4;
int x = 0;
int y = n-1;
int time = 0;
board[x][y] = true;
while (true) {
time++;
//현재 값 가져오
//시간에 돌리기
if (time == v.front().first) {
if (move == 1) {
if (v.front().second == 'L') {
move = 3;
}
else if (v.front().second == 'D') {
move = 4;
}
}
else if (move == 2) {
if (v.front().second == 'L') {
move = 4;
}
else if (v.front().second == 'D') {
move = 3;
}
}
else if (move == 3) {
if (v.front().second == 'L') {
move = 2;
}
else if (v.front().second == 'D') {
move = 1;
}
}
else if (move == 4) {
if (v.front().second == 'L') {
move = 1;
}
else if (v.front().second == 'D') {
move = 2;
}
}
v.push(v.front());
v.pop();
}
//이동
if (move == 1) {
y += 1;
}
else if (move == 2) {
y -= 1;
}
else if (move == 3) {
x -= 1;
}
else if (move == 4) {
x += 1;
}
//사과 검사
if (apple[x][y] == false) {
if (move == 1) {
board[x][y - 1] = false;
}
else if (move == 2) {
board[x][y + 1] = false;
}
else if (move == 3) {
board[x + 1][y] = false;
}
else if (move == 4) {
board[x - 1][y] = false;
}
}
else {
apple[x][y] = false;
}
//벽이나 자기 좀 걸리면 끝
if (board[x][y] == true || !(x >= 0 && x < n && y >= 0 && y < n)) {
break;
}
board[x][y] = true;
bam++;
}
cout << time << endl;
return;
}
int main() {
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
input();
solve();
return 0;
}