본문 바로가기

IT 일기/코테

마법사 상어와 비바라기 - 파이썬

728x90

 

N,M = map(int,input().split())
baskets = []
for i in range(N):
    baskets.append(list(map(int,input().split())))

# clouds = [[0 for _ in range(N)] for _ in range(N)]
# clouds[N-1][0], clouds[N-1][1], clouds[N-2][0],clouds[N-2][1] = 1,1,1,1
clouds = [[N-1,0],[N-1,1],[N-2,0],[N-2,1]]

dx = [0,-1,-1,-1,0,1,1,1]
dy = [-1,-1,0,1,1,1,0,-1]

for _ in range(M):
    d,s = map(int, input().split())
    # print(clouds)
    # for basket in baskets:
    #     print(basket)
    # print("===================")
    # print()
    rainPos = [] #비 내린 구름 위치 확인
    rainIn = {}
    for i in range(len(clouds)):
        #구름 이동
        cloudX = (clouds[i][0] + dx[d-1]*s)%N
        cloudY = (clouds[i][1] + dy[d-1]*s)%N
        #구름에서 비 내리기
        baskets[cloudX][cloudY] += 1
        #구름 위치 저장
        rainPos.append([cloudX,cloudY])
        rainIn[(cloudX,cloudY)]=1

        # 비내린곳 물복사
    for rain in rainPos:
        for j in range(1, 8, 2):
            posX = rain[0] + dx[j]
            posY = rain[1] + dy[j]
            if posX < 0 or posX >= N or posY < 0 or posY >= N:
                continue
            else:
                if baskets[posX][posY] > 0:
                    baskets[rain[0]][rain[1]] += 1
    newCloud=[]
    for j in range(N):
        for k in range(N):
            if baskets[j][k] >= 2 and (j,k) not in rainIn:
                baskets[j][k] -= 2
                newCloud.append([j,k])
    clouds = newCloud

sum = 0
for basket in baskets:
    for i in basket:
        sum += i
print(sum)

단순 구현이라 시간복잡도를 고려하지 않아도 됐다. 그래도 시간초과가 나왔는데 not in을 사용하는 부분에서 list를 사용하다보니 생긴 문제였음.

 

사전에 꼼꼼히 설계하고 풀면 문제점을 빠르게 찾을 수 있음

728x90