-
[백준] 20056번: 마법사 상어와 파이어볼(구현, Python)Algorithm PS👩🏻💻/백준 2023. 10. 8. 04:09
문제
https://www.acmicpc.net/problem/20056
20056번: 마법사 상어와 파이어볼
첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치
www.acmicpc.net
풀이
- 시뮬레이션, 구현
- 방향성 조건때문에 헷갈려서 시간이 너무 오래걸렸다 ㅜㅜㅜㅜ 시뮬레이션은 ㄹㅇ 독해가 중요한듯,,
- 모여진 파이어볼의 방향이 모두 짝이거나 홀이면 -> [0, 2, 4, 6], 그렇지 않고 섞여있는 방향이면 -> [1, 3, 5, 7] 이다.
import math from copy import deepcopy # move # 일단 방향대로 속력만큼 움직이기, (현재칸 + dx[i] * 속력) % N 만큼 이동시키기 # 각 배열에 추가하기 dx = [-1, -1, 0, 1, 1, 1, 0, -1] dy = [0, 1, 1, 1, 0, -1, -1, -1] def move(board): nboard = [[[]for _ in range(N)] for _ in range(N)] for i in range(N): for j in range(N): if board[i][j]: #비어있지 않으면 while board[i][j]: m, s, d = board[i][j].pop() nx = (i + dx[d] * s) % N ny = (j + dy[d] * s) % N nboard[nx][ny].append((m, s, d)) return nboard # 새거에서 2개이상의 볼 4개로 나누기 # 다 나누면 new -> b로 바꾸기는 return def divide(nboard): for i in range(N): for j in range(N): if len(nboard[i][j]) > 1: num = len(nboard[i][j]) weight, speed, direction = 0, 0, [0] dd = [0, 0] for k in range(num): m, s, d = nboard[i][j].pop() weight += m speed += s dd[d % 2] += 1 weight = math.floor(weight/5) speed = math.floor(speed/num) if dd[0] == num or dd[1] == num: direction = [0, 2, 4, 6] else: direction = [1, 3, 5, 7] if weight != 0: for dd in range(4): nboard[i][j].append((weight, speed, direction[dd])) return nboard N, M, K = map(int, input().split()) # m개의 볼 정보를 입력받으면, 초기 board에 (m, s, d) 순으로 넣어놓는다. board = [[[]for _ in range(N)] for _ in range(N)] for _ in range(M): r, c, m, s, d = map(int, input().split()) board[r-1][c-1].append((m, s, d)) while K: new = move(board) board = divide(new) K -= 1 # 질량 더하기 answer = 0 for i in range(N): for j in range(N): if board[i][j]: answer += sum(board[i][j][k][0] for k in range(len(board[i][j]))) print(answer)
'Algorithm PS👩🏻💻 > 백준' 카테고리의 다른 글
[백준] 15732번: 도토리 숨기기(Pyhton, 이진 탐색) (0) 2024.03.21 [백준] 21278번: 호석이 두마리 치킨(Python, 플로이드워셜) (0) 2024.03.20 [백준] 5639번: 이진검색트리(Python) (0) 2023.08.11 [백준] 9935번: 문자열 폭발(Python) (0) 2023.08.11 [백준] 1068번: 트리(Python) (2) 2023.08.10