20056.마법사 상어와 파이어볼
Updated:
Intro
- 오늘은 삼성 SW 역량 모의 테스트를 대비해서 20056번 마법사 상어와 파이어볼 문제를 풀어보았습니다.
마법사 상어와 파이어볼
문제 설명
- N: NxN격자크기, M: 파이어볼 갯수, K: 명령 횟수
- 위치:r,c 질량:m 속력:s 방향:d
- 명령
- 모든 파이어볼이 방향과 속력만큼 이동한다. (이동후 같은 칸에 파이어볼 중복 가능)
- 이동이 모든 끝난후, 같은칸의 파이어볼은 1개로 합쳐진다.
- 파이어볼은 4개로 나뉜다.
- 질량: 질량합/5
- 속력: 속력합/합쳐진갯수
- 방향: 모두 홀수 or 짝수이면 0,2,4,6 or 1,3,5,7
- 질량0인 파이어볼은 소멸
문제 접근 방식
- dictionary를 이용해 key로는 해당 좌표, 그리고 value로는 질량, 속력, 방향을 저장하였습니다.
-
좌표를 저장할때는 “행/열” 형태로 string으로 저장하였습니다.
-
좌표가 이미 존재한다면, 질량, 속력, 방향을 추가하고, 존재하지 않는다면 새로운 key-value pair를 추가하는 방식으로 진행했습니다.
-
문제 답안
-
N, M, K = map(int, input().split()) directions = { 0: (-1, 0), 1: (-1, 1), 2: (0, 1), 3: (1, 1), 4: (1, 0), 5: (1, -1), 6: (0, -1), 7: (-1, -1) } fireballs = [list(map(int, input().split())) for _ in range(M)] for _ in range(K): info = dict() coordinates = set() for fireball in fireballs: r, c, m, s, d = fireball # 방향대로 이동하기 # 방향 구하기 r = (r + directions[d][0]*s) % N c = (c + directions[d][1]*s) % N # hash로 처리하기 hashed= str(r) + "/" + str(c) if hashed in info: info[hashed].append([m, s, d]) else: info[hashed] = [[m, s, d]] coordinates.add((r, c)) # 파이어볼 합치기 fireballs =[] for coord in coordinates: r, c = coord hashed = str(r) + "/" + str(c) # 만약 겹치는 좌표가 없다면 if len(info[hashed]) == 1: m, s, d = info[hashed][0] fireballs.append([r, c, m, s, d]) # 만약 겹치는 좌표가 있다면 else: tot_mass = 0 tot_velocity = 0 direction = 99999 direction_changed = False odd = 0 even = 0 # 해당 좌표의 각 파이어볼마다 for each in info[hashed]: m, s, d = each tot_mass += m tot_velocity += s # 방향이 바뀌는지 안바뀌는지 확인한다. if d % 2 == 0: even += 1 else: odd += 1 # 질량 구하기 m = int(tot_mass/5) s = int(tot_velocity/len(info[hashed])) #방향이 바뀌었다면 if even and odd: d = [1, 3, 5, 7] # 방향이 바뀌지 않았다면 else: d = [0, 2, 4, 6] # 만약 질량이 0 이 아니면 fireballs 배열에 추가한다. if m != 0: for i in range(4): fireballs.append([r, c, m, s, d[i]]) #총 질량 구하기 ans = 0 for coord in fireballs: ans += coord[2] print(ans)
Leave a comment