Coding Test/백준(Python)
[백준/Python] 21610번(구현)_마법사 상어와 비바라기
syunze
2024. 3. 13. 15:23
📌문제 유형
구현, 시뮬레이션 (골드 5, 삼성기출)
📌문제
21610번: 마법사 상어와 비바라기
마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를 시전하면 하늘에 비구름을 만들 수 있다. 오늘은 비바라기
www.acmicpc.net
📌나의 문제풀이
- 주의사항
- 2) 구름 비 내리고 물의 양 다 증가한 다음, 4) 대각선 관련 구현해야 함 (for문 2중으로 하면 틀림)
- 구름 위치가 -이거나 n 넘어가는 경우
- - 인 경우 : n * ceil(move / n)
- n 넘어가는 경우 : (- 인 경우 조정해도 n 넘어갈 수 있음, 그래서 if문 사용) groom[i][0] % n
from math import ceil
n,m = map(int, input().split())
maps = []
for _ in range(n):
list_ = list(map(int,input().split()))
maps.append(list_)
# 방향 원래 숫자 넘어가는거 조정해야 함
dirs = {1:[0,-1], 2:[-1,-1], 3:[-1,0], 4:[-1,1],
5:[0,1], 6:[1,1], 7:[1,0], 8:[1,-1]}
groom = [[n-1,0], [n-1,1], [n-2,0], [n-2,1]]
for _ in range(m):
dir, move = map(int,input().split())
visited = [[0 for _ in range(n)] for _ in range(n)]
# 1) 구름 이동, 2) 구름에서 비 내림
for i in range(len(groom)):
groom[i][0] = groom[i][0] + (dirs[dir][0] * move)
groom[i][1] = groom[i][1] + (dirs[dir][1] * move)
if groom[i][0] < 0:
groom[i][0] += (n * ceil(move / n))
if groom[i][0] >= n:
groom[i][0] = groom[i][0] % n
if groom[i][1] < 0:
groom[i][1] += (n * ceil(move / n))
if groom[i][1] >= n:
groom[i][1] = groom[i][1] % n
maps[groom[i][0]][groom[i][1]] += 1
visited[groom[i][0]][groom[i][1]] = 1
# 4) 물복사버그 마법
for i in range(len(groom)):
cnt = 0
dia = [[-1,-1], [-1,1], [1,1], [1,-1]]
for k in range(4):
nx = groom[i][0] + dia[k][0]
ny = groom[i][1] + dia[k][1]
if 0 <= nx < n and 0 <= ny < n:
if maps[nx][ny] > 0:
cnt += 1
maps[groom[i][0]][groom[i][1]] += cnt
# 5) 바구니 물양 2 이상
groom = []
for x in range(n):
for y in range(n):
if visited[x][y] == 0 and maps[x][y] >= 2:
maps[x][y] -= 2
groom.append([x,y])
ans = 0
for line in maps:
ans += sum(line)
print(ans)
📌다른사람의 문제풀이
[백준 21610] 마법사 상어와 비바라기(Python 풀이)
https://www.acmicpc.net/problem/21610 21610번: 마법사 상어와 비바라기 마법사 상어는 파이어볼, 토네이도, 파이어스톰, 물복사버그 마법을 할 수 있다. 오늘 새로 배운 마법은 비바라기이다. 비바라기를
kimjingo.tistory.com
📌리뷰
- 삼성문제는 조건 꼼꼼히! 하나라도 놓치면 틀림
728x90