본문 바로가기

알고리즘 문제풀이/백준

백준(boj) 3190_뱀 (파이썬, c++)


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

풀이


뱀의 이동 방향과, 시간에 따른 방향의 변화가 주어진다. 뱀의 머리가 움직일 때 그 자리에 사과가 있으면 사과를 먹고 꼬리는 그대로 두고, 만약 사과가 없으면 머리를 움직이고 마지막 꼬리를 잘라낸다. 꼬리의 순서가 필요하므로 tail이라는 이름의 queue를 사용했다 . 시간에 따른 방향 변화도 큐에 넣고 제일 앞에 있는 원소의 시간이 현재 시간과 같으면 방향 지시에 따라 방향을 변화 시켜 주었다. 방향은 dd배열을 URDL순으로 만들어 놓고, 시계방향이면 dd배열의 다음 방향으로 바꾸고, 반시계방향이면 dd배열의 전(前) 방향으로 바꿔주었다.

python3

from sys import*
from collections import*
input = stdin.readline
n=int(input())  
k=int(input())  #사과 개수
a=[[0]*n for _ in range(n)]
for i in range(k):
   x, y = map(int,input().split())
   a[x-1][y-1] = 1
l=int(input())                          #뱀 방향 변환 횟수
move_q = deque(); tail=deque()
for i in range(l):
   x, c = map(str, input().split())     #오름차순으로 주어짐
   move_q.append((x, c))
time = 0
dd=[(-1,0),(0,1),(1,0),(0,-1)]          #URDL
nx, ny, d = 0, 0, 1
tail.append((0, 0))
while 1:
   if len(move_q)>0 and int(move_q[0][0]) == time:
       x, c = move_q.popleft()
       if c == 'L':    #왼쪽
           d = (d+3)%4
       else:           #오른쪽
           d = (d+1)%4
   dx, dy = dd[d]
   nx, ny = nx+dx, ny+dy
   if nx<0 or ny<0 or nx>n-1 or ny>n-1 or a[nx][ny]==2: break
   if a[nx][ny] == 0:
       rx, ry = tail.popleft()
       a[rx][ry]=0
   a[nx][ny]=2
   tail.append((nx,ny))
   time+=1
print(time+1)

C++

#include<cstdio>
#include<queue>
#include<memory.h>
using namespace std;
typedef pair<int, int> P;
const int SIZE = 101;
int main()
{
   int n, k;
   int a[SIZE][SIZE];
   memset(a, 0, sizeof(a));
   scanf("%d", &n);
   scanf("%d", &k);
   for(int i=0; i<k; i++){
       int x, y;
       scanf("%d %d", &x, &y);
       a[x-1][y-1]=1;
  }
   int l;
   scanf("%d", &l);
   queue<P> move_q;
   queue<P> tail;
   for(int i=0; i<l; i++){
       int x;char c;
       scanf("%d %c", &x, &c);
       move_q.push({x, c});
  }
   int time = 0;
   int dx[4] = {-1, 0, 1, 0};
   int dy[4] = {0, 1, 0, -1};
   int nx=0, ny=0, d=1;
   tail.push({0, 0});
   while(1){
       if (move_q.size()>0 && move_q.front().first == time){
           int x; char c;
           c = move_q.front().second;
           move_q.pop();
           if(c=='L') d=(d+3)%4;
           else d=(d+1)%4;
      }
       nx = nx+dx[d], ny = ny+dy[d];
       if (nx<0 || ny<0 || nx>n-1 || ny>n-1 || a[nx][ny]==2) break;
       if (a[nx][ny] == 0){
           int rx, ry;
           rx = tail.front().first;
           ry = tail.front().second;
           tail.pop();
           a[rx][ry] = 0;
      }
       a[nx][ny]=2;
       tail.push({nx, ny});
       time++;
  }
   printf("%d",time+1);
   return 0;
}


고찰


그녀는 배앰 배앰 배앰 같은 녀자