0과 1 사이
[파이썬(python)] 구현 문제 뱀 시뮬레이션 본문
https://www.acmicpc.net/problem/3190
아주 어려운 문제였다.. ㅠㅠ
일단 이해하지 못한 포인트가 있었다. 자기자신의 몸과 부딪히면 게임이 끝난다는데, 무슨 말이지..?
그리고 뱀의 길이가 늘어나는 것을 어떻게 처리해야하나 고민스러웠다.
아직 이해하지 못했으나 일단 내가 작성한 코드만 올려본다.
내가 짠 코드
def new_direction(original_direct, change_direct, i, j):
#원래 방향과 회전 방향에 따라 새로운 인덱스를 출력해주는 함수
#D는 오른쪽, L은 왼쪽, U는 위쪽, E는 아래쪽
if original_direct == 'D':
if change_direct == 'None':
return i, j+1, 'D'
elif change_direct == 'L':
return i-1, j, 'U'
elif change_direct == 'D':
return i+1, j, 'E'
elif original_direct =='U':
if change_direct == 'None':
return i-1, j, 'U'
elif change_direct == 'L':
return i, j-1, 'L'
elif change_direct == 'D':
return i, j+1, 'D'
elif original_direct == 'E':
if change_direct == 'None':
return i+1, j, 'E'
elif change_direct == 'L':
return i, j+1, 'D'
elif change_direct =='D':
return i, j-1, 'L'
elif original_direct == 'L':
if change_direct == 'None':
return i, j-1, 'L'
elif change_direct == 'L':
return i+1, j, 'E'
elif change_direct == 'D':
return i-1, j, 'U'
N = int(input()) #보드의 크기
K = int(input()) #사과의 개수
apple = [[0 for _ in range(N)] for _ in range(N)]
count = 0 #초 세기
length = 1 #뱀 길이
direction = []
for _ in range(K):
i, j = map(int, input().split())
apple[i-1][j-1] = 1 #사과 있는 곳만 1로 표시
L = int(input())
for _ in range(L):
x, c = input().split()
x = int(x)
direction.append([x,c])
i= 0
j= 0
keepgoing = True
original_direct = 'D'
change_direct = 'None'
while keepgoing:
#방향 정해줌
#i, j 값 알려줌
for list in direction:
if count in list:
change_direct = list[1]
i, j, original_direct = new_direction(original_direct, change_direct, i, j)
if i >= N or j >= N or i < 0 or j < 0:
keepgoing = False
elif apple[i][j] == 1:
length += 1
apple[i][j] = 0
count += 1
print(count)
답안을 보고 작성한 전체 코드이다
n = int(input())
k = int(input())
data = [[0] * (n+1) for _ in range(n+1)]
#1행 1열부터 시작이라 0행 0열은 없는것과 같은데 이럴때 인덱스가 은근히 헷갈린다.. 그런데 n+1 * n+1 크기의 배열을 정해두면 인덱스에서 -1 해줄 필요가 없다
info = []
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 = [(1,1)] #큐를 구현해서 뱀이 위치한 곳을 저장해둔다
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 #뱀이 있는 곳은 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]: #index 변수를 설정할 생각은 안했다..
direction = turn(direction, info[index][1])
index += 1
return time
print(simulate())
'코딩테스트' 카테고리의 다른 글
[파이썬(python)] 이것이 취업을 위한 코딩테스트다 개미 전사 (0) | 2022.02.11 |
---|---|
[파이썬(python)] 이것이 취업을 위한 코딩테스트다 게임 개발 118p (0) | 2022.02.07 |
[파이썬(python)] 구현 문제 자물쇠와 열쇠 (0) | 2022.01.28 |
[파이썬(python)] 정렬 문제 실패율 (0) | 2022.01.19 |
[파이썬(python)] 정렬 문제 안테나 백준 18310 (0) | 2022.01.19 |
Comments