백준 20056 마법사 상어와 파이어볼

gmlwlswldbs·2021년 10월 21일
0

코딩테스트

목록 보기
60/130
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, 1, 1, 1, 0, -1, -1, -1]

n, m, k = map(int, input().split())
g = [[[] * n for _ in range(n)] for _ in range(n)]

for _ in range(m):
    r, c, m, s, d = map(int, input().split())
    g[r-1][c-1].append((m, s, d))

def move(g):
    tmp_g = [[[] * n for _ in range(n)] for _ in range(n)]
    for i in range(n):
        for j in range(n):
            if len(g[i][j]) == 0:
                continue
            for k in range(len(g[i][j])):
                fs = g[i][j][k][1]
                fd = g[i][j][k][2]
                ni, nj = (i + (dx[fd]*fs))%n, (j + (dy[fd]*fs))%n
                tmp_g[ni][nj].append((g[i][j][k]))
    return tmp_g

def div_ball(balllist):
    tmp_balllist = []
    sum_m = 0
    sum_s = 0
    sum_d = 0
    for i in range(len(balllist)):
        bm = balllist[i][0]
        bs = balllist[i][1]
        bd = balllist[i][2]
        sum_m += bm
        sum_s += bs
        sum_d += bd
    input_m = int(sum_m/5)
    if input_m == 0:
        return tmp_balllist
    input_s = int(sum_s/len(balllist))
    for i in range(4):
        tmp_balllist.append((input_m, input_s, ((i*2)+(sum_d)%2)))
    return tmp_balllist

turn = 0
while True:
    turn += 1
    if turn == k+1:
        break
    g = move(g)
    for i in range(n):
        for j in range(n):
            if len(g[i][j]) >= 2:
                g[i][j] = div_ball(g[i][j])

ans = 0
for i in range(n):
    for j in range(n):
        if len(g[i][j]) == 0:
            continue
        for k in range(len(g[i][j])):
            dd = g[i][j][k][0]
            ans += dd
print(ans)

처음 짠 코드 : 0%대에 틀림
(방향이 모두 짝수거나 모두 홀수면) -> 0, 2, 4, 6
(그 외) -> 1, 3, 5, 7
인데 이상하게 생각함

그렇다고 합으로 하면 안되는게 짝+짝+짝+짝도 합이 짝수지만 홀+홀+짝+짝도 합이 짝수다
하나하나 따져줘야함. 문제를 잘 보면 다 나와있다!!!!!!!!!!

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

n, m, k = map(int, input().split())
g = [[[] * n for _ in range(n)] for _ in range(n)]

for _ in range(m):
    r, c, m, s, d = map(int, input().split())
    g[r-1][c-1].append((m, s, d))

def move(g):
    tmp_g = [[[] * n for _ in range(n)] for _ in range(n)]
    for i in range(n):
        for j in range(n):
            if len(g[i][j]) == 0:
                continue
            for k in range(len(g[i][j])):
                fs = g[i][j][k][1]
                fd = g[i][j][k][2]
                ni, nj = (i + (dx[fd]*fs))%n, (j + (dy[fd]*fs))%n
                tmp_g[ni][nj].append((g[i][j][k]))
    return tmp_g

def div_ball(balllist):
    tmp_balllist = []
    sum_m = 0
    sum_s = 0
    allodd = 0
    alleven = 0
    for i in range(len(balllist)):
        bm = balllist[i][0]
        bs = balllist[i][1]
        bd = balllist[i][2]
        sum_m += bm
        sum_s += bs
        if bd % 2 == 0:
            alleven += 1
        else:
            allodd += 1
    input_m = int(sum_m/5)
    if input_m == 0:
        return tmp_balllist
    input_s = int(sum_s/len(balllist))
    # 모두 짝수이거나 모두 홀수일 때
    if alleven == len(balllist) or allodd == len(balllist):
        for i in range(4):
            tmp_balllist.append((input_m, input_s, i*2))
        return tmp_balllist
    # 나머지
    else:
        for i in range(4):
            tmp_balllist.append((input_m, input_s, i*2+1))
        return tmp_balllist

turn = 0
while True:
    turn += 1
    if turn == k+1:
        break
    g = move(g)
    for i in range(n):
        for j in range(n):
            if len(g[i][j]) >= 2:
                g[i][j] = div_ball(g[i][j])

ans = 0
for i in range(n):
    for j in range(n):
        if len(g[i][j]) == 0:
            continue
        for k in range(len(g[i][j])):
            dd = g[i][j][k][0]
            ans += dd
print(ans)

0개의 댓글