본문 바로가기
Data Science/삼성 SW역량테스트 기출 (백준 문제집)

[백준][파이썬] 3190 :뱀

by titaniumm 2020. 4. 28.

[핵심]

1. 뱀의 형태를 deque로 저장하기

처음에 True false 맵으로 뱀의 상태를 저장하려 했으나, 뱀의 움직임을 고려하는것이 매우 복잡했다.

FIFO 이러한 형태의 문제를 잘 기억할것

 

2. if 와 elif는 다르다.

if와 elif의 차이를 정확히 기억하자(이것때매 오류 발생)

-다시 검토하고 싶을 땐 if 두번

-다시 검토 아닐때 if , eilf

 

3. time을 언제줄지도 중요!

from collections import deque
num = int(input())
map1 = [[0 for i in range(num)] for j in range(num)]
gogo = deque()

capple = int(input()) # 사과의 수
#dchange = [] # 사과 저장
for i in range(capple): #맵 저장
    x,y = map(int,input().split())
    map1[x-1][y-1] = 1

dchange = int(input()) #방향 수
change =[] # 방향 저장
for i in range(dchange): #방향 저장
    tt = list(map(str,input().split()))
    change.append(tt)
times =[] # 시간만 따로 저장
for j in change:
    times.append(int(j[0]))

gogo.append([0,0])
dir = "right"
xx=0
yy=0
time =0
len =1
tem =""
while True:
    if time in times:
        for _ in change:
            if time == int(_[0]):
                tem = _[1]
    else:
        tem =""

    if dir =="right" and tem == "D":
        dir = "down"
    elif dir =="right" and tem =="L":
        dir = "up"

    elif dir =="down" and tem == "D":
        dir = "left"

    elif dir =="down" and tem =="L":
        dir = "right"

    elif dir =="left" and tem == "D":
        dir = "up"

    elif dir =="left" and tem =="L":
        dir = "down"

    elif dir =="up" and tem == "D":
        dir = "right"

    elif dir =="up" and tem =="L":
        dir = "left"
    time += 1

    if dir == "right":
        if yy+1 < 0 or yy+1 >= num or [xx,yy+1] in gogo:
            break
        if map1[xx][yy+1] == 1:
            map1[xx][yy + 1] = 0
            gogo.append([xx,yy+1])
            len+=1
            yy += 1
        else:
            gogo.popleft()
            gogo.append([xx,yy+1])
            yy += 1
    elif dir =="down":
        if xx+1 < 0 or xx+1 >= num or [xx+1,yy] in gogo:
            break
        if map1[xx+1][yy] == 1:
            map1[xx + 1][yy] = 0
            gogo.append([xx+1,yy])
            len+=1
            xx +=1
        else:
            gogo.popleft()
            gogo.append([xx+1,yy])
            xx +=1

    elif dir =="left":
        if yy-1 < 0 or yy-1 >= num or [xx,yy-1] in gogo:
            break
        if map1[xx][yy-1] == 1:
            map1[xx][yy - 1] = 0
            gogo.append([xx,yy-1])
            len+=1
            yy -=1
        else:
            gogo.popleft()
            gogo.append([xx,yy-1])
            yy -=1

    elif dir =="up":
        if xx-1 < 0 or xx-1 >= num or [xx-1,yy] in gogo:
            break
        if map1[xx-1][yy] == 1:
            map1[xx - 1][yy] = 0
            gogo.append([xx-1,yy])
            len +=1
            xx -=1
        else:
            gogo.popleft()
            gogo.append([xx-1,yy])
            xx -=1

print(time)

댓글