https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
백준 3190 문제를 푸는데 시물레이션 문제라 문제 요구 사항만 그대로 구현하면 됐으나
구현 능력이 부족하여 제 시간안에 해결하지 못하였다.
NxN board를 만들 때 나는 index를 0부터 시작해서 N-1로 만드는데 나동빈님 같은 경우는 직관적이게 1~N으로
만드는 거 같다. 앞으로도 의식적으로 이 방식으로 만들려고 노력해야겠다.
def turn(direction, c):
if c == "L":
direction = (direction -1) % 4
else:
direction = (direction+1) % 4
return direction
방향을 전환하는 함수이다 여기서 파이썬은 음수를 나누기 연산을 할 때
A % B (A<0, B>0) A가 양수가 될 때까지 B를 더해주고 나머지를 구한다는 것을 알게 되었다
#처음에는 오른쪽으로 보고 있었으니 (동, 남, 서, 북)
dx = [0, 1, 0, -1]
dy = [1, 0, -1 ,0]
원래 같으면 dx,dy 를 동서남북 순으로 두겠지만 이 문제같은 경우는 90도 회전 수를 기준으로 배열해 놓았다
전체코드
더보기
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 #처음에는 동쪽을 보고 있음
time = 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:
#벽이나 뱀의 몸통과 부딪혔다면
time +=1
break
x,y = nx, ny
time +=1
if index < l and time == info[index][0]:
#회전할시간
direction = turn(direction,info[index][1])
index +=1
return time
머릿 속의 구현과 일치했지만 코드 짜는 실력이 부족해서 구현하지 못했다.
코드를 안보고 짤 수 있을 때까지 이 문제는 여러번 풀어 봐야 할 것 같다.
반응형