[백준]21610(파이썬) - 마법사 상어와 비바라기
resilient
·2021. 12. 31. 02:02
728x90
반응형
- 이 문제는 2021 삼성 하반기 코딩테스트 문제입니다.
- 삼성 코딩테스트의 특징대로, 하나하나씩 주어진 조건에 따라서 구현을 해봤습니다.
- 이 문제에서 가장 오래 걸렸던 부분은 구름위치인 4칸을 각각 대각선 방향으로 옮길 때 어떻게 연결할 것인가 였습니다. 주어진 5 * 5 격자에서 여러 번 손으로 써보니까 규칙이 나왔고, 식을 구해서 대입했습니다. 아마도 다른 분들도 이 부분이 가장 까다롭지 않았나 싶습니다.
- 나머지는 조건에 따라 순서대로 구현하였고 자세한 조건 순서 및 구현 설명은 주석에 담았습니다.
import sys
input = sys.stdin.readline
n,m = map(int,input().split())
A = [list(map(int,input().split())) for i in range(n)]
move_list = []
for i in range(m):
temp = list(map(int,input().split()))
move_list.append([temp[0]-1,temp[1]])
clouds = [[n-1,0],[n-1,1],[n-2,0],[n-2,1]]
dx = [0, -1, -1, -1, 0, 1, 1, 1]
dy = [-1, -1, 0, 1, 1, 1, 0, -1]
for i in range(m):
x,y = move_list[i]
#1.이동한구름위치
nextcloud = []
for cloud in clouds:
nx = (cloud[0] + dx[x] * y) % n
ny = (cloud[1] + dy[x ]* y) % n
nextcloud.append([nx,ny])
#방문처리
visited = [[0]*n for _ in range(n)]
for cloud in nextcloud:
# 지금 칸에 비를 뿌린다.
A[cloud[0]][cloud[1]] += 1
visited[cloud[0]][cloud[1]] = 1
#3.구름이 모두사라진다
clouds = []
# 물복사버그 대각선으로 퍼진다
dx2 = [-1,-1,1,1]
dy2 = [-1,1,-1,1]
for _x,_y in nextcloud:
cnt = 0
for i in range(4):
nx = _x+ dx2[i]
ny = _y+ dy2[i]
if 0<= nx <n and 0<= ny <n and A[nx][ny]: # 물이 있을 때
cnt += 1
A[_x][_y] += cnt
# 4. 바구니에 저장된 물의 양이 2 이상인 모든 칸에 구름이 생기고, 물의 양이 2 줄어든다. 이때 구름이 생기는 칸은 3에서 구름이 사라진 칸이 아니어야 한다.
for i in range(n):
for j in range(n):
if A[i][j] >= 2 and visited[i][j] == 0:
A[i][j] -= 2
clouds.append([i,j])
total = 0
for i in range(n):
total += sum(A[i])
print(total)
반응형
'자료구조 & 알고리즘 > 백준(Baekjoon)' 카테고리의 다른 글
[백준]12685(파이썬) - 평범한 배낭 (0) | 2022.01.06 |
---|---|
[백준]2206(파이썬) - 벽 부수고 이동하기 (0) | 2022.01.04 |
[백준]16928(파이썬) - 뱀과 사다리 게임 (0) | 2021.12.29 |
[백준]14891(파이썬) - 톱니바퀴 (0) | 2021.12.09 |
[백준]14503(파이썬) - 로봇청소기 (6) | 2021.12.06 |