17143 - 낚시왕
2022. 6. 25. 21:40ㆍ2022/BaekJoon_삼성 SW 역량 테스트 기출
이번 문제는 하라는대로 잘 만 하면 되는 문제다.
그러나 딱 한가지 좀 시간이 걸렸던 부분이라면 상어가 더이상 갈 곳이 없으면 반대방향으로 전환하여 계속 남은 부분을 이동하는 것이었는데 분명 수식이 있을것이라 생각하였다. 해당 수식은 sharkMove에 구현되어있다.
이것만 제외하면 생각보다 쉽게 풀려지는 문제였다.
def sharkMove(x, y, s, d):
# print("-----------------------" + str(x) + ', ' + str(y) + "-------------------------------")
# 1 : 위 , 2 : 아래, 3 : 오른쪽, 4 : 왼쪽
dx = [0, -1, 1, 0, 0]
dy = [0, 0, 0, 1, -1]
nx = x + (dx[d] * s); ny = y + (dy[d] * s)
# print("nx: " + str(nx) + ', ' + 'ny: ' + str(ny))
# d = 1 = 위, d = 2 = 아래, d = 3 = 오른쪽, d = 4 = 왼쪽
while nx < 1 or nx > R or ny < 1 or ny > C:
if nx < 1:
d = 2
nx = 1 - (nx-1)
# print('1 - nx : ' + str(nx))
elif nx > R:
d = 1
nx = (2 * R) - nx
# print('2 - nx : ' + str(nx))
elif ny < 1:
d = 3
ny = 2 - ny
# print('3 - ny: ' + str(ny))
elif ny > C:
d = 4
ny = (2 * C) - ny
# print('4 - ny: ' + str(ny))
return nx, ny, d
from copy import deepcopy
if __name__ == "__main__":
# 낚시왕이 있는 곳 = [0,0]
# 낚시왕이 오른쪽으로 한칸이동
# 낚시왕이 있는 열의 상어 중에서 땅과 가장 가까운 상어를 잡음 -> 상어는 사라짐
# 상어 이동
# 상어가 이동하려는 칸이 격자판의 경계를 넘는 경우에 방향을 바꿔 속력을 유지한채 이동
# 상어가 이동한 뒤에 한 칸에 상어 두마리 이상이 있을수 있는데, 크기가 가장 큰 상어가 나머지 상어를 모두 잡아먹음
R, C, M = map(int, input().split())
graph = [[0] * (C + 1) for _ in range(R + 1)] # 상어 위치
graph[0][0] = 2 # 낚시꾼의 위치
sGraph = [[-1] * (C + 1) for _ in range(R + 1)] # 속력
dGraph = [[-1] * (C + 1) for _ in range(R + 1)] # 이동방향
zGraph = [[-1] * (C + 1) for _ in range(R + 1)] # 크기
for i in range(M):
r, c, s, d, z = map(int, input().split())
graph[r][c] = 1
sGraph[r][c] = s
dGraph[r][c] = d
zGraph[r][c] = z
dx = [0, 1, -1, 0, 0]
dy = [0, 0, 0, 1, -1]
result = 0
for c in range(1, C + 1):
# 낚시꾼의 위치 이동
graph[0][c - 1] = 0
graph[0][c] = 2
# print(zGraph)
# 낚시왕과 같은 열의 가장 가까운 상어는 잡아먹음
for r in range(1, R + 1):
if graph[r][c] == 1:
result += zGraph[r][c]
graph[r][c] = 0; sGraph[r][c] = -1; dGraph[r][c] = -1; zGraph[r][c] = -1
break
# 상어 이동 확인
moveChk = [[False] * (C + 1) for _ in range(R + 1)]
copyGraph = [[0] * (C + 1) for _ in range(R + 1)]; copysGraph = [[-1] * (C + 1) for _ in range(R + 1)]; copydGraph = [[-1] * (C + 1) for _ in range(R + 1)]; copyzGraph = [[-1] * (C + 1) for _ in range(R + 1)]
for x in range(1, R + 1):
for y in range(1, C + 1):
if graph[x][y] == 1:
s = sGraph[x][y]
d = dGraph[x][y]
z = zGraph[x][y]
nx, ny, d = sharkMove(x, y, s, d)
# 이미 (nx, ny) 좌표에 이동한 물고기가 있음 -> 큰 물고기가 작은 물고기를 잡아먹어야함
if moveChk[nx][ny] == True:
# 새로 들어오는 상어가 더 큰 경우에 큰 상어의 정보가 바뀌고, 반대의 경우에는 그대로
if zGraph[x][y] > copyzGraph[nx][ny]:
copysGraph[nx][ny] = sGraph[x][y]
copydGraph[nx][ny] = d
copyzGraph[nx][ny] = zGraph[x][y]
else:
moveChk[nx][ny] = True
copyGraph[nx][ny] = 1
copysGraph[nx][ny] = sGraph[x][y]
copydGraph[nx][ny] = d
copyzGraph[nx][ny] = zGraph[x][y]
graph = copyGraph; sGraph = copysGraph; dGraph = copydGraph; zGraph = copyzGraph
print(result)
'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글
14499 - 주사위 굴리기 (0) | 2022.07.26 |
---|---|
17140 - 이차원 배열과 연산 (0) | 2022.07.07 |
15685 - 드래곤 커브 (0) | 2022.06.10 |
16234 - 인구 이동 (0) | 2022.05.13 |
15684 - 사다리조작 (0) | 2022.05.11 |