21610 - 마법사 상어와 비바라기
2022. 9. 27. 08:01ㆍ2022/BaekJoon_삼성 SW 역량 테스트 기출
레벨 5 문제로 크게 어렵지 않은 문제였다... 시간초과만 아니라면!!!
진짜 문제푸는데 걸린시간보다 시간초과 해결하는데 걸린시간이 더 긴 것 같다.
아래는 제일 처음 냈던 풀이 방식이다.
# 비구름 : [N, 1], [N, 2], [N-1, 1], [N-1, 2]
# 구름의 이동 M번 명령
global makeCloud
N, M = map(int, input().split())
graph = []
for _ in range(N):
graph.append(list(map(int, input().split())))
ds = []
for _ in range(M):
ds.append(list(map(int, input().split())))
makeCloud = [[N-1, 0], [N-1, 1], [N-2, 0], [N-2, 1]]
# ←, ↖, ↑, ↗, →, ↘, ↓, ↙
# direction = [[0,-1], [-1, -1], [-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1]]
dx = [0,-1,-1,-1,0,1,1,1]
dy = [-1,-1,0,1,1,1,0,-1]
# 구름의 이동 -> 구름이 있는 칸에 비가 1씩 내리고, 구름이 사라짐
def firstMove(graph, d, s):
locAfterMove = []
for x, y in makeCloud:
nx = (x+dx[d-1]*s+N)%N
ny = (y+dy[d-1]*s+N)%N
graph[nx][ny] += 1
locAfterMove.append([nx, ny])
return graph, locAfterMove
def secondMove(graph, locAfterMove):
copyGraph = [tmpGraph[:] for tmpGraph in graph]
newMakeCloud = []
for x in range(N):
for y in range(N):
if [x, y] in locAfterMove:
for i in range(4):
nx = x + dx[(i*2)+1]
ny = y + dy[(i*2)+1]
if 0<=nx<N and 0<=ny<N and graph[nx][ny] > 0:
copyGraph[x][y] += 1
elif graph[x][y] >= 2:
copyGraph[x][y] -= 2
newMakeCloud.append([x, y])
return newMakeCloud, copyGraph
for d, s in ds:
first = firstMove(graph, d, s)
newGraph = first[0]; locAfterMove = first[1]
second = secondMove(graph, locAfterMove)
makeCloud = second[0]; graph = second[1]
result = 0
for i in range(N):
result += sum(graph[i])
print(result)
처음에는 구름이 있는 자리를 if _ in _ 으로 탐색했는데, 이를 visited라는 2차원 배열로 변경해서 탐색을 하니
시간초과 문제가 해결되었다... 너무 어이없어 ㅠ.ㅠ
N, M = map(int, input().split())
graph = []
for _ in range(N):
graph.append(list(map(int, input().split())))
ds = []
for _ in range(M):
ds.append(list(map(int, input().split())))
makeCloud = [[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]
def firstMove(graph, makeCloud):
visited = [[False] * N for _ in range(N)]
for x, y in makeCloud:
nx = (x + dx[d - 1] * s + N) % N
ny = (y + dy[d - 1] * s + N) % N
graph[nx][ny] += 1
visited[nx][ny] = True
return graph, visited
def secondMove(graph, visited):
makeCloud = []
copyGraph = [tmp[:] for tmp in graph]
for x in range(N):
for y in range(N):
if visited[x][y] == True:
for i in range(4):
nx = x + dx[(i * 2) + 1]
ny = y + dy[(i * 2) + 1]
if 0 <= nx < N and 0 <= ny < N and graph[nx][ny] > 0:
copyGraph[x][y] += 1
elif graph[x][y] >= 2:
copyGraph[x][y] -= 2
makeCloud.append([x, y])
return makeCloud, copyGraph
for d, s in ds:
f = firstMove(graph, makeCloud)
graph = f[0]; visited = f[1]
s = secondMove(graph, visited)
makeCloud = s[0]; graph = s[1]
result = 0
for i in range(N):
result += sum(graph[i])
print(result)
'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글
21608 - 상어 초등학교 (0) | 2022.08.27 |
---|---|
19238 - 스타트 택시 (0) | 2022.08.25 |
17142 - 연구소3* (0) | 2022.08.16 |
16235 - 나무재테크 (0) | 2022.08.07 |
14499 - 주사위 굴리기 (0) | 2022.07.26 |