본문 바로가기
코딩 테스트/구현

by hazel_ 2021. 1. 19.

p.327

 

방법 1

N = int(input())  # 보드의 크기
K = int(input())  # 사과의 갯수

apple_p = []  # 사과의 위치
for i in range(K):
    apple = list(map(int, input().split()))
    apple_p.append(apple)

L = int(input())
d = []  # 방향을 바꾸는 시간과 바뀔 방향
for i in range(L):
    td = list(map(str, input().split()))
    d.append(td)
d.sort(key=lambda x: int(x[0]))
dcount = 0

count = 0  # 시간을 세는 변수

dire = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 동 남 서 북 (L -1 D 1)

# map위에 사과 그리기
dmap = [[0] * N for _ in range(N)]
for apple in apple_p:
    dmap[apple[0] - 1][apple[1] - 1] = 1

snake = []
snake.append((1, 1))
snake_x = 1
snake_y = 1

direction = 0

while True:
    count+=1
    
    snake_x = snake_x + dire[direction][0]
    snake_y = snake_y + dire[direction][1]
    print(snake_x, snake_y,"count = ", count)
    if snake_x < 1 or snake_x > N or snake_y < 1 or snake_y > N or dmap[
            snake_x-1][snake_y-1] == 9:
        print(count)
        break
    else:
        snake.append((snake_x, snake_y))
        if dmap[snake_x-1][snake_y-1] == 1:
            dmap[snake_x-1][snake_y-1]=9
            pass
        else:
            dmap[snake_x-1][snake_y-1]=9
            snake_pop = snake.pop(0)
            dmap[snake_pop[0]-1][snake_pop[1]-1] = 0
            
    # 방향 전환
    if dcount<L and int(d[dcount][0]) == count:
        if d[dcount][1] == 'L':
            direction -= 1
            if direction < 0:
                direction = 3
        else:
            direction += 1
            if direction > 3:
                direction = 0
        dcount+=1

 

 

방법 2

n=int(input())
k=int(input())
data=[[0]*(n+1) for _ in range(n+1)] # 맵 정보
info=[] # 방향 회전 정보

# 맵 정보 (사과 있는 곳은 1로 표시)
for _ in range(k):
  a,b=map(int, input().split())
  data[a][b]=1

# 방향 회전 정보 입력
l=int(input())
for _ in range(l):
  x,c=input().split()
  info.append((int(x),c))

# 처음에는 오른쪽을 보고 있으므로(동,남,서,북)
dx=[0,1,0,-1]
dy=[1,0,-1,0]

def turn(direction,c):
  if c=='L':
    direction=(direction-1)%4
  else:
    direction=(direction+1)%4
  return direction

def simulate():
  x,y=1,1 # 뱀의 머리 위치
  data[x][y]=2 # 뱀이 존재하는 위치는 2로 표시
  direction=0 # 처음에는 동쪽을 보고 있음
  t=0 #시작한 뒤에 지난 '초'시간
  index=0 # 다음에 회전할 정보
  q=[(x,y)] # 뱀이 차지하고 있는 위치 정보(꼬리가 앞쪽)

  while True:
    nx=x+dx[direction]
    ny=y+dy[direction]

    # 맵 범위가 안에 있고, 뱀의 몸통이 없는 위치라면,
    if 1<=nx and nx<=n and 1<=ny and ny<=n and data[nx][ny]!=2:
      # 사과가 없다면 이동 후에 꼬리 제거
      if data[nx][ny] == 0:
        data[nx][ny]=2
        q.append((nx,ny))
        px,py=q.pop(0)
        data[px][py]=0

      # 사과가 있다면 이동 후에 꼬리 그대로 두기
      if data[nx][ny]==1:
        data[nx][ny]=2
        q.append((nx,ny))
    
    # 벽이나 뱀의 몸통과 부딪혔다면
    else:
      t+=1
      break
    x,y=nx,ny # 다음 위치로 머리를 이동
    t+=1
    
    if index<l and t==info[index][0]:
      direction=turn(direction,info[index][1])
      index+=1
  return t
print(simulate())

 

방법 3

from collections import deque
import sys

input=sys.stdin.readline

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

board=[[0]*(n+1) for _ in range(n+1)]

for _ in range(k):
    a,b=map(int, input().split())
    board[b][a]=1 # 사과

l= int(input())

move=deque()

for _ in range(l):
    a,b=map(str, input().split())

    move.append((int(a),b))

#-------------------------------------------------------

count=0 # 시간
move_time, move_direction = move.popleft()

direction=[[1,0],[0,1],[-1,0],[0,-1]]
direction_count=0 # 오른쪽으로 이동 (x,y)

snake_x, snake_y = 1,1 # 뱀 시작위치
snake=deque()
snake.append((snake_x, snake_y)) 


while True:
    # 벗어나거나, 자기 몸과 닿으면 break
    # 뱀 이동, 사과 있으면 머리 위치 add
    #         사과 없으면 머리 위치 add후 popleft
    # move 시간 되면 돌려(모든 행동 후 맨 마지막 행동)
    count+=1

    snake_x+=direction[direction_count][0]
    snake_y+=direction[direction_count][1]
    if snake_x < 1 or snake_y < 1 or snake_x > n or snake_y > n: # 벽에 부딪히면
        break
    else:
        if (snake_x, snake_y) in snake: # 뱀의 몸이 만났을때
            break

        if board[snake_x][snake_y]==1: # 사과
            snake.append((snake_x, snake_y))
            board[snake_x][snake_y]=0

        elif board[snake_x][snake_y]==0: # 빈 곳
            snake.popleft()
            snake.append((snake_x, snake_y))

    if move_time==count:
        if move_direction=='D':
            direction_count=(direction_count+1)%4
        elif move_direction=='L':
            direction_count=(direction_count-1)%4
        if move:
            move_time, move_direction = move.popleft()



print(count)

'코딩 테스트 > 구현' 카테고리의 다른 글

치킨 배달  (0) 2021.01.22
기둥과 보 설치  (0) 2021.01.20
자물쇠와 열쇠  (0) 2021.01.19
게임 개발  (0) 2021.01.19
왕실의 나이트  (0) 2021.01.19

댓글