알고리즘/백준 문제풀이

[삼성SW역량][Python/BOJ] 백준 20057 마법사 상어와 토네이도_(구현)

개발자 덕구🐾 2022. 8. 31. 23:14
728x90

 

 

 

어떻게 구현 문제는 풀어도 풀어도 모르겠지 

으아

 

 

 

 

코드 : 

def move(cnt, dx,dy,dir) :
    global ans 
    for _ in range(cnt+1) :
        # 다음 좌표 
        now[0],now[1] = now[0] + dx, now[1] + dy
        # (0,0) 까지 이동한 뒤 소멸 
        if now[0] < 0 or now[1] < 0 : break
        
        spreads = 0 
        for dx,dy, r in rate[dir] :
            nx,ny = now[0] + dx , now[1] + dy 
            # 알파 ( 남은 모래의 양 )
            if r == 0 : sand =mp[now[0]][now[1]] - spreads
            # % 가 있을 때 
            else : sand=  int(mp[now[0]][now[1]] * r) 
        
        	# 내부라면 축적
            if 0<=nx<n and 0<=ny<n : 
                mp[nx][ny]  += sand 
            # 외부라면 ans에 축적 
            else :
                ans += sand 
            # 축적된 양를 저장 
            spreads += sand 

   
    
if __name__=="__main__" :
    n = int(input())
    mp = [list(map(int,input().split())) for _ in range(n)]
    ans = 0
    now = [n//2,n//2]
    
    left = [[-2,0,0.02], [2,0,0.02] ,[-1,0,0.07], [1,0,0.07] ,[-1,1,0.01],[1,1,0.01],[-1,-1,0.1],[1,-1,0.1],[0,-2,0.05],[0,-1,0]]
    right = [[x,-y,z] for x,y,z in left] 
    down = [[-y,x,z] for x,y,z in left] 
    up = [[-x,y,z] for x,y,z in down]
    rate = {'left' : left, 'right' : right, 'down' : down, 'up' : up}
    
    for i in range(n) :
        if i%2 == 0 : 
            move(i,0,-1,'left') # 왼쪽 
            move(i,1,0,'down') # 아래쪽 
        else :
            move(i,0,1,'right') # 오른쪽
            move(i,-1,0,'up')  # 위쪽 
    print(ans)

 

 

 

 

 

참고 블로그 : 

 

https://yeon-code.tistory.com/94

 

[python] BOJ 백준 20057: 마법사상어와 토네이도

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

yeon-code.tistory.com

 

반응형