20057 - 마법사 상어와 토네이도
2022. 5. 3. 14:06ㆍ2022/BaekJoon_삼성 SW 역량 테스트 기출
import math
def ratioList(x, y, idx):
#서
if idx == 0:
ratioList = [[[x, y-2], 0.05],
[[x+1, y-1], 0.1], [[x-1, y-1], 0.1],
[[x+1, y], 0.07], [[x-1, y], 0.07],
[[x+1, y+1], 0.01], [[x-1, y+1], 0.01],
[[x+2, y], 0.02], [[x-2, y], 0.02]]
#남
elif idx == 1:
ratioList = [[[x+2, y], 0.05],
[[x+1, y+1], 0.1], [[x+1, y-1], 0.1],
[[x, y+1], 0.07], [[x, y-1], 0.07],
[[x-1, y+1], 0.01], [[x-1, y-1], 0.01],
[[x, y+2], 0.02], [[x, y-2], 0.02]]
#동
elif idx == 2:
ratioList = [[[x, y+2], 0.05],
[[x+1, y+1], 0.1], [[x-1, y+1], 0.1],
[[x+1, y], 0.07], [[x-1, y], 0.07],
[[x+1, y-1], 0.01], [[x-1, y-1], 0.01],
[[x+2, y], 0.02], [[x-2, y], 0.02]]
else:
ratioList = [[[x-2, y], 0.05],
[[x-1, y+1], 0.1], [[x-1, y-1], 0.1],
[[x, y+1], 0.07], [[x, y-1], 0.07],
[[x+1, y+1], 0.01], [[x+1, y-1], 0.01],
[[x, y+2], 0.02], [[x, y-2], 0.02]]
return ratioList
#이동 한 후 graph에 있는 모래의 양 확인
def tornado(graph, x, y, idx):
global remainSend
ratioL = ratioList(x, y, idx)
ratioSend = 0
for ratio in ratioL:
tx = ratio[0][0]
ty = ratio[0][1]
#범위를 벗어나는 모래는 카운팅
if tx<=0 or tx>N or ty<=0 or ty>N:
remainSend += int(graph[x][y]*ratio[1])
ratioSend += int(graph[x][y]*ratio[1])
#연산결과가 1이상이면 정수 양만큼 다음 칸으로 모래 이동
elif int(graph[x][y]*ratio[1])>0:
graph[tx][ty] += int(graph[x][y]*ratio[1])
ratioSend += int(graph[x][y]*ratio[1])
if idx == 0:
a = x; b = y-1
elif idx == 1:
a = x+1; b=y
elif idx == 2:
a=x; b=y+1
else:
a=x-1; b=y
send = graph[x][y]-ratioSend
if (0<a<=N) and (0<b<=N):
graph[a][b] += send
else:
remainSend+=send
graph[x][y] = 0
return graph
# 서 -> 남 -> 동 -> 북
dx = [0, 1, 0, -1]
dy = [-1, 0, 1, 0]
idx = -1
remainSend = 0
N = int(input())
graph = [[0]*(N+1)]
for _ in range(N):
graph.append([0] + list(map(int, input().split())))
x = math.ceil(float(N)/float(2)); y = x
curLoc = graph[x][y]
cnt = 0
for i in range(1, N):
cnt += 1
if i == N-1:
for j in range(3):
idx = (idx+1)%4
for k in range(i):
x += dx[idx]; y += dy[idx]
graph = tornado(graph, x, y, idx)
else:
for j in range(2):
idx = (idx+1)%4
for k in range(i):
x += dx[idx]; y += dy[idx]
graph = tornado(graph, x, y, idx)
print(remainSend)
'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글
14891 - 톱니바퀴 (0) | 2022.05.04 |
---|---|
20058 - 마법사 상어와 파이어스톰 (0) | 2022.05.03 |
17822 - 원판 돌리기 (0) | 2022.05.03 |
17144 - 미세먼지 안녕! (0) | 2022.05.03 |
16236 - 아기상어* (0) | 2022.05.03 |