
https://www.acmicpc.net/problem/3190
# Try
def solution(n, k, data, l, directions):
time = 0
direct = 0
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
snake = [[1,1]]
while True:
for _ in range(len(directions)):
direction = directions.pop(0)
time_at, turn = direction[0], direction[1]
while time < time_at:
time += 1
head = snake[-1]
x = head[0] + dx[direct]
y = head[1] + dy[direct]
if x < 1 or x > n or y < 1 or y > n: # 벽에 박음
return time
if data[x][y] == 2: # 몸통에 박음
return time
snake.append([x,y])
if data[x][y] == 0:
a, b = snake[0]
data[a][b] = 0
del snake[0]
data[x][y] = 2
#show_snake(n, snake)
if turn == 'D':
direct += 1
elif turn == 'L':
direct -= 1
if direct == -1:
direct = 3
if direct == 4:
direct = 0
time += 1
head = snake[-1]
x = head[0] + dx[direct]
y = head[1] + dy[direct]
if x < 1 or x > n or y < 1 or y > n: # 벽에 박음
return time
if data[x][y] == 2: # 몸통에 박음
return time
snake.append([x,y])
if data[x][y] == 0:
a, b = snake[0]
data[a][b] = 0
del snake[0]
data[x][y] = 2
#show_snake(n, snake)
return time
def show_snake(n, snake):
array = [[0] * (n + 1) for _ in range(n + 1)]
for i in snake:
array[i[0]][i[1]] = 1
for i in range(n + 1):
print(array[i])
# Input
n = int(input())
k = int(input())
data = [[0] * (n + 1) for _ in range(n + 1)]
directions = []
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()
directions.append([int(x), c])
print(solution(n, k, data, l, directions)) # 예상 출력 : 9
6
3
3 4
2 5
5 3
3
3 D
15 L
17 D
9
# Input 1
n = 6
k = 3
data = [[0] * (n + 1) for _ in range(n + 1)]
data[3][4] = 1
data[2][5] = 1
data[5][3] = 1
l = 3
directions = [(3, 'D'), (15, 'L'), (17, 'D')]
print(solution(n, k, data, l, directions)) # 예상 출력 : 9
9
# Input 2
n = 10
k = 4
data = [[0] * (n + 1) for _ in range(n + 1)]
data[1][2] = 1
data[1][3] = 1
data[1][4] = 1
data[1][5] = 1
l = 4
directions = [(8, 'D'), (10, 'D'), (11, 'D'), (13, 'L')]
print(solution(n, k, data, l, directions)) # 예상 출력 : 21
21
# Input 3
n = 10
k = 5
data = [[0] * (n + 1) for _ in range(n + 1)]
data[1][5] = 1
data[1][3] = 1
data[1][2] = 1
data[1][6] = 1
data[1][7] = 1
l = 4
directions = [(8, 'D'), (10, 'D'), (11, 'D'), (13, 'L')]
print(solution(n, k, data, l, directions)) # 예상 출력 : 13
13
내 맘대로 지저분하게 풀었다. 반복하여 같은 내용이 적힌 부분도 있다.
문제 제출 통과는 하였지만 코드를 좀 더 다듬을 필요가 있다.
배열의 갯수, 위치, 반복 횟수 등등 n, n-1, n+1 범위를 확실하게 파악하고 문제를 풀자.
for a in b 반복문은 b에 대하여 pop, del 함수를 사용하면 복잡하게 동작하게 되니 b에 대한 조작이 필요한 경우에는 range를 사용하자.
b = [1,2,3]
for a in b:
print(b)
b.pop(0)
[1, 2, 3]
[2, 3]