낚시왕 파이썬 백준 17143
문제
input
첫째 줄에 격자판의 크기 R, C와 상어의 수 M이 주어진다. (2 ≤ R, C ≤ 100, 0 ≤ M ≤ R×C)
둘째 줄부터 M개의 줄에 상어의 정보가 주어진다. 상어의 정보는 다섯 정수 r, c, s, d, z (1 ≤ r ≤ R, 1 ≤ c ≤ C, 0 ≤ s ≤ 1000, 1 ≤ d ≤ 4, 1 ≤ z ≤ 10000) 로 이루어져 있다. (r, c)는 상어의 위치, s는 속력, d는 이동 방향, z는 크기이다. d가 1인 경우는 위, 2인 경우는 아래, 3인 경우는 오른쪽, 4인 경우는 왼쪽을 의미한다.
두 상어가 같은 크기를 갖는 경우는 없고, 하나의 칸에 둘 이상의 상어가 있는 경우는 없다.
output
낚시왕이 잡은 상어 크기의 합을 출력한다.
TODO
상어[key] = value # value = x,y,s,d,z
world[x][y] = key
for position in c :
for r in range(R):
world[r][position] != 0 -> 상어 정보 삭제
for c in range(C):
world[r][c] = 0 -> 초기화
1초 후 방향
R = 4 s = 3 r= 0
0 1 2 3 4 5 6 7 8 9
> > > < < < > > > < ...
# 0에서 출발했을때 R-1번마다 바뀜 ->
((x+s)) // (r-1)) %2 == 1
((r-1 - x + s) // (r-1)) % 2 ==1
d = change[d] #{1:2, 2:1, 3:4, 4:3}
1초 후 상어 위치
R = 5
0 1 2 3,..., R-1, R-2, R-3 ,..., 1 반복
(x+s)%(r+(r-2))
(r-1)-x+s) % (r+(r-2)
CODE
r,c,m = map(int,input().split())
sharks = [list(map(int,input().split())) for _ in range(m)]
shark_dict = {}
world = [[0 for _ in range(c)] for _ in range(r)]
for i,shark in enumerate(sharks):
shark[0] -=1
shark[1] -=1
shark_dict[i+1] = shark
world[shark[0]][shark[1]] = i+1
r_position_d = [i for i in range(r)] + [j for j in range(r-2,0,-1)]
r_position_u = [i for i in range(r-1, -1, -1 )] + [j for j in range(1,r-1)]
c_position_r = [i for i in range(c)] + [j for j in range(c-2,0,-1)]
c_position_l = [i for i in range(c-1,-1,-1)] + [j for j in range(1,c-1)]
position = [0,r_position_u, r_position_d , c_position_r, c_position_l]
answer = 0
for pos in range(c):
catch = False
for i in range(r):
if not catch and world[i][pos] !=0 :
answer += shark_dict[world[i][pos]][4]
del shark_dict[world[i][pos]]
world[i][pos] = 0
catch = True
for j in range(c):
world[i][j] = 0
if not shark_dict.keys():
break
key_list = list(shark_dict.keys())
for key in key_list:
x,y,s,d,z = shark_dict[key]
nx,ny = x,y
if s != 0 :
if d == 1 :
nx = position[d][((r-1)-x+s) % (r+(r-2))]
if ((r-1 - x + s) // (r-1)) % 2 :
d = 2
elif d == 2 :
nx = position[d][(x+s)%(r+(r-2))]
if ((x+s)//(r-1))%2 :
d= 1
elif d==3 :
ny = position[d][(y+s)%(c+(c-2))]
if ((y+s)//(c-1))%2 :
d=4
elif d == 4 :
ny = position[d][(c-1-y + s) %(c+(c-2))]
if ((c-1 - y + s ) // (c-1)) %2 :
d= 3
if world[nx][ny] != 0 :
if shark_dict[world[nx][ny]][4] > z :
del shark_dict[key]
continue
else :
del shark_dict[world[nx][ny]]
world[nx][ny] = key
else :
world[nx][ny] = key
shark_dict[key] = [nx,ny,s,d,z]
print(answer)
회고
A4용지를 꺼내들게 만든 문제였다.
상어 방향 바꾸는게 맘대로 안돼서 답답했다. 결국 하나하나 바꿈.
주섬주섬 하다보니 애매해져서 코드가 드러워졌다.
다음 문제부턴 깔끔하게 하자.
if world[nx][ny] != 0 :
후반부 이 조건문에서 상어의 정보를 지우고 key를 삭제했는데
shark_dict[key]= [nx,ny,s,d,z]
로 다시 넣고 있어서 상어 삭제가 안됐고, 틀렸습니다. 나오길래 당황했다.
예시는 다 맞았는데 그래버리니깐.. continue로 해결했다.
Author And Source
이 문제에 관하여(낚시왕 파이썬 백준 17143), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ifelifelse/낚시왕-파이썬-백준-17143저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)