낚시왕 파이썬 백준 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로 해결했다.

좋은 웹페이지 즐겨찾기