여름의 서재

[백준] 20057_마법사 상어와 토네이도 본문

알고리즘/BOJ

[백준] 20057_마법사 상어와 토네이도

엉아_ 2021. 10. 30. 00:54
728x90

📕 문제

https://www.acmicpc.net/problem/20057

 

20057번: 마법사 상어와 토네이도

마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을

www.acmicpc.net

 

💡 풀이법

1. 먼저 왼쪽으로 방향이 갈 때 y를 기준으로 모래가 퍼지는 좌표와 퍼센트를 lst에 담았다.

2. t_lst는 바람의 방향에 따라 lst의 좌표를 회전시킬 리스트이다.

3. wind 함수는 모래를 날리는 함수이다. 바람의 방향에 따라 퍼지는 위치를 변경시켜주고, 퍼지는 곳이 인덱스를 벗어난다면 total에 더하고, 아니라면 해당 인덱스에 더한다.

4. 바람의 길이는 1,1,2,2,3,3,4,4.....n,n,n 이다. 즉 n전까지는 두번씩 길이가 반복되다가 n이 되면 3번 반복된다.

5. for문을 돌며 길이만큼 같은 방향으로 움직이고 바람의 길이가 끝나면 방향을 바꿔주면서 wind 함수를 실행해준다.

 

lst = [(-1,1,1),(1,1,1),(-2,0,2),(-1,0,7),(1,0,7),(2,0,2),(-1,-1,10),(1,-1,10),(0,-2,5),(0,-1, 0)]
t_lst = [(0,1,[1,1]), (1,0,[-1,-1]), (0,1,[1,-1]), (1,0,[1,1])]

def wind(x, y, t):
    global total
    r = sand
    i, j, txy = t_lst[t]
    for item in lst:
        dx, dy = item[i]*txy[0], item[j]*txy[1]
        nx, ny = x + dx, y + dy

        if item[2] == 0:
            s = r
        else:
            s = (sand*item[2])//100
            r -= s

        if nx < 0 or nx >= N or ny < 0 or ny >= N:
            total += s
        else:
            A[nx][ny] += s
    

N = int(input())
A = [list(map(int, input().split())) for _ in range(N)]
total = 0
dx = [0, 1, 0, -1]
dy = [-1, 0, 1, 0]

x, y = N//2, N//2
t = 0
for i in range(1, N):
    if i == N-1:
        c = 3
    else:
        c = 2
    for _ in range(c):
        for _ in range(i):
            x, y = x + dx[t], y + dy[t]
            sand = A[x][y]
            A[x][y] = 0
            wind(x, y, t)
        t = (t+1)%4
print(total)

 

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 2688_줄어들지 않아 (dp 이용)  (0) 2021.10.31
[백준] 14719_빗물  (0) 2021.10.30
[백준] 1463_1로 만들기 (dp 이용)  (0) 2021.10.30
[백준] 3190_뱀  (0) 2021.10.30
[백준] 16926_배열 돌리기1  (0) 2021.10.25
Comments