posts
[백준 3190번] 뱀 - Python 으로 구현하기
jyyoonz
2019. 10. 17. 14:58
[백준 3190번] 뱀 Python 으로 구현하기
- 삼성 SW테스트 초창기 문제라 그런지 최근 문제들에 비해 비교적 조건이 적은 편
- 주어진 조건들과 상황에 따라 그대로 코드로 옮기면 풀리는 시뮬레이션 유형의 문제
- 아래 코드는 list.pop(0) 와 oper.pop(0)의 시간복잡도를 고려하지 않은 코드
* 해당 코드에서 Python의 list 대신 deque 를 쓰면 pop 연산의 O(n)의 시간복잡도를 O(1)로 바꿀 수 있다!
# 백준 3190번 - 뱀
n=int(input()) # 맵크기
k=int(input()) # 사과
# 맵
board=[[0]*(n+1) for i in range(n+1)]
# 사과 정보
for _ in range(k):
x,y=map(int,input().split())
board[x][y]=1
# oper
oper=[input().split() for _ in range(int(input()))]
snake=[(1,1)] # snake 몸
# 끝나는 경우 -> 맵 밖에 나감 or 자신의 몸에 닿음
# 뱀은 처음에 오른쪽을 향한다.
d = [(0,1),(1,0),(0,-1),(-1,0)] # 동남서북
d_f=0
score=0 # 시간
x,y=1,1
while True:
score+=1
# 다음 x,y
x+=d[d_f][0]
y+=d[d_f][1]
if 1<=x<=n and 1<=y<=n:
snake.append((x,y)) # 몸길이 늘림
for i in snake[:-1]: # 자기 몸과 부딪힌경우
if (x,y)==i:
print(score)
exit(0)
if board[x][y]==0: # 그냥 통로임-> 꼬리 삭제
snake.pop(0)
if board[x][y]==1:
board[x][y]=0
else: # 맵을 나간 경우
print(score)
break
if oper and score==int(oper[0][0]):
if oper[0][1]=='D': # 오른쪽 90
d_f= d_f+1 if d_f<3 else 0
oper.pop(0)
elif oper[0][1]=='L': # 왼쪽 90
d_f = d_f - 1 if d_f > 0 else 3
oper.pop(0)
* 틀린 부분이나 더 나은 방법이 있을 수 있습니다. 지적해 주시면 감사하겠습니다!