코딩테스트/BOJ

[백준] [구현] 3190.뱀 -미완

박소민 2023. 2. 5. 14:03
3190. 뱀
  • 내 풀이
from collections import deque
n=int(input()) #NxN
dir=[[0 for j in range(n)] for i in range(n)]
apple= int(input()) #사과 개수
for i in range(apple): #사과 위치
  ax,ay=map(int,input().split())
  dir[ax-1][ay-1]=1

m=int(input()) #뱀 방향변환 횟수
ls=deque()
for i in range(m): 
  ls.append(input().split())

cnt=0
brk=0 #break 여부
dx,dy=0,0
dix = 1 #방향 인덱스 (시작 : 오른쪽)
while ls and brk==0:
  #초, 방향
  s,d=ls.popleft()
  
  #위, 오, 아래, 왼
  x=[-1,0,1,0]
  y=[0,1,0,-1]
  
  dl=[] #뱀의 몸이 위치한 모든 곳
  for i in range(int(s)-cnt):
    cnt+=1

    nx=dx+ x[dix]
    ny=dy+ y[dix]

    if nx<0 or nx>=n or ny<0 or ny>=n:
      
      brk=1
      break
    if (nx,ny) in dl: #이동위치에 뱀의 몸이 있으면
      
      brk=1
      break
      
    if dir[nx][ny]==1: #사과가 있으면
      dir[nx][ny]=0 #사과는 없어지고
      dl.append((dx,dy)) #발
      dl.append((nx,ny)) #머리
    else: #사과가 없으면
      if dl:
        dl.pop(0) #발위치 없앰

    #for문이 break되지 않으면
    dx=nx #이동
    dy=ny
    
  #방향 인덱스 
  if d=="L": #왼쪽
    dix-=1
    if dix<0:
      dix=3
  elif d=="D": #오른쪽
    dix+=1
    if dix>3:
      dix=0

if brk==0: #에러 없이 끝나면
  if dix==0:
    cnt+=dx+1
  elif dix==1:
    cnt+=(n-dy)
  elif dix==2:
    cnt+=(n-dx)
  elif dix==3:
    cnt+=dy+1
  
print(cnt)

 

from collections import deque

n=int(input()) #NxN
dir=[[0 for j in range(n)] for i in range(n)]
apple= int(input()) #사과 개수
for i in range(apple): #사과 위치
    ax,ay=map(int,input().split())
    dir[ax-1][ay-1]=1

m=int(input()) #뱀 방향변환 횟수
ls=deque()
for i in range(m): 
    ls.append(input().split())

cnt=0
brk=0 #break 여부
dx,dy=0,0
dix = 1 #방향 인덱스 (시작 : 오른쪽)
while ls and brk==0:
    #초, 방향
    s,d=ls.popleft()

    #위, 오, 아래, 왼
    x=[-1,0,1,0]
    y=[0,1,0,-1]

    dl=[] #뱀의 몸이 위치한 모든 곳
    for i in range(int(s)-cnt):
        cnt+=1

        nx=dx+ x[dix]
        ny=dy+ y[dix]

        if nx<0 or nx>=n or ny<0 or ny>=n:
            brk=1
            break
        if (nx,ny) in dl: #이동위치에 뱀의 몸이 있으면
            brk=1
            break
      
        if dir[nx][ny]==1: #사과가 있으면
            dir[nx][ny]=0 #사과는 없어지고
            dl.append((dx,dy)) #발
            dl.append((nx,ny)) #머리
        else: #사과가 없으면
            if dl:
                dl.pop(0) #발위치 없앰

        #for문이 break되지 않으면
        dx=nx #이동
        dy=ny
    
    #방향 인덱스 
    if d=="L": #왼쪽
        dix-=1
    if dix<0:
        dix=3
    elif d=="D": #오른쪽
        dix+=1
        if dix>3:
            dix=0

if brk==0: #에러 없이 끝나면
    if dix==0:
        cnt+=dx+1
    elif dix==1:
        cnt+=(n-dy)
    elif dix==2:
        cnt+=(n-dx)
    elif dix==3:
        cnt+=dy+1

print(cnt)