-
백준20056 ) 마법사 상어와 파이어볼🧨PS 2022. 6. 3. 10:57반응형
삼성 코테 타입의 문제다. 그 중 치사하지 않은 편.
좌표 배열 만들어 할라했는데 N이 50이면 매 번 2500회 돌아야하니까 패스.
파이어볼의 위치를 dict로 만들어 구현했다.dict로 구현해도 괜찮은 이유는 파이어볼이 움직일 때 제약사항이 하나도 없다. 범위를 벗어나는 것은 나머지 연산으로 쉽게 해결 가능.
dict를 하나만 쓰면 움직인 후 위치가 기존 위치와 겹칠 수 있어 move 함수 내에서 post_dic을 선언하고 리턴하는 방향으로 구현함
n,m,k = map(int,input().split()) fb = [list(map(int,input().split())) for i in range(m)] diry = [-1,-1,0,1,1,1,0,-1] dirx = [0,1,1,1,0,-1,-1,-1] fb_dict = {} for f in fb: r,c,m,s,d = f[0],f[1],f[2],f[3],f[4] fb_dict[(r,c)] = [[m,s,d]] def move(prev): post = {} for key in prev.keys(): balls = prev[key] y = key[0] x = key[1] for ball in balls: m,s,d = ball[0],ball[1],ball[2] ty = ((y+(diry[d]*s))+(10000*n))%n tx = ((x+(dirx[d]*s))+(10000*n))%n post_key = (ty,tx) if post_key in post.keys(): post[post_key].append(ball) else: post[post_key] = [ball] to_del = [] for key in post.keys(): balls = post[key] sum_ball = len(balls) if sum_ball==1: continue m_sum = 0 s_sum = 0 od,ev = 0,0 for ball in balls: m,s,d = ball[0],ball[1],ball[2] m_sum += m s_sum += s if d%2==1: od+=1 else: ev+=1 if m_sum//5==0: to_del.append(key) else: s = s_sum//sum_ball m = m_sum//5 post[key] = [] if od==0 or ev==0: dir_arr = [0,2,6,4] else: dir_arr = [1,3,5,7] for i in range(4): post[key].append([m,s,dir_arr[i]]) for d in to_del: del post[d] return post for i in range(k): fb_dict = move(fb_dict) ans = 0 for key in fb_dict.keys(): for ball in fb_dict[key]: ans+=ball[0] print(ans)
반응형'PS' 카테고리의 다른 글
백준1339) 단어 수학 (0) 2022.06.03 백준1941 ) 소문난 칠공주👩🏼🦰 python (0) 2022.06.03