반응형
20056번: 마법사 상어와 파이어볼 (acmicpc.net)
<문제 풀이>
- 2차원 배열로 진행하면서 헤매다가 fireball의 정보의 좌표를 key, 좌표에 있는 파이어볼 정보를 list로 만들어 풀었더니 쉽게 구현이 가능했다.
- '행과 열은 1번부터 N번까지 번호가 매겨져 있고, 1번 행은 N번과 연결되어 있고, 1번 열은 N번 열과 연결되어 있다.'는 파이어볼이 이동시 행 또는 열의 좌표가 N-1번, N번, 1번, 2번 이런 식으로 이동한다는 뜻인데, 처음에 이해를 못 해서 혼자 헤매기도 했다.(독해력 수준...)
- 처음에 파이어볼 정보를 입력받고 저장할 때 추후 파이어볼이 이동할 때 좌표를 모듈로 연산을 하기 위해 각각 -1씩 해서 좌표를 저장했다. (문제에서 주어진 파이어볼의 좌표는 1~N번까지이기 때문)
- 나머지는 조건에 주어진대로 순서대로 구현했다.
<Code>
from collections import defaultdict
import sys
input = sys.stdin.readline
n, m, k = map(int, input().split())
fireball = defaultdict(list) # (행, 열): [[질량, 속력, 방향]]
for _ in range(m):
# [행, 열, 질량, 속력, 방향]
temp = list(map(int, input().split()))
fireball[(temp[0]-1, temp[1]-1)].append(temp[2:])
#방향
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
dx = [0, 1, 1, 1, 0, -1, -1, -1]
for _ in range(k): # 명령 횟수 만큼 반복
temp = defaultdict(list) # 이동한 파이어볼 정보 저장
# 숫자는 문제에서 주어진 조건
# 1
for key, val in fireball.items():
for info in val:
y = (key[0] + info[1] * dy[info[2]]) % n
x = (key[1] + info[1] * dx[info[2]]) % n
temp[(y, x)].append(info)
# 2
for key, val in temp.items():
num = len(val) # 좌표에 있는 파이어볼 수
if num >= 2: # 좌표에 파이어볼이 하나 있다면 2번 조건 pass
mass, speed, a, b = 0, 0, 0, 0 # 누적 질량, 누적 속력, 홀수 방향 개수, 짝수 방향 개수
for info in val:
mass += info[0]
speed += info[1]
if info[2] % 2:
a += 1
else:
b += 1
mass //= 5 # 2.3.1
speed //= num # 2.3.2
if mass: # 2.3.3
if a == num or b == num: # 모두 홀수 or 모두 짝수인 경우
temp[key] = [[mass, speed, 0], [mass, speed, 2], [mass, speed, 4], [mass, speed, 6]]
else: # 나머지
temp[key] = [[mass, speed, 1], [mass, speed, 3], [mass, speed, 5], [mass, speed, 7]]
else: # 2.4
temp[key] = []
fireball = temp
answer = 0
for val in fireball.values(): # 질량의 합
for info in val:
answer += info[0]
print(answer)
※ 잘못된 점, 개선점 등이 있다면 언제든 댓글로 알려주시면 감사하겠습니다.
반응형
'Alogorithm > BAEKJOON' 카테고리의 다른 글
[BAEKJOON] 23290 마법사 상어와 복제 - Python (0) | 2023.03.30 |
---|---|
[BAEJOON] 21611 마법사 상어와 블리자드 - Python (0) | 2023.03.29 |
[BAEKJOON] 21610 마법사 상어와 비바라기 - Python (0) | 2023.03.28 |
[BAEKJOON] 21608 상어 초등학교 - Python (2) | 2023.03.24 |
[BAEKJOON] 9084 동전 - Python (0) | 2023.03.22 |