본문 바로가기
Problem Solving/BOJ

[Python]17143. 낚시왕

by 부르르 2019. 4. 18.

https://www.acmicpc.net/problem/17143

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. 칸에는 상어가 최대 한 마리 들어있을 수 있다. 상어는 크기와 속도를 가지고 있다. 낚시왕은 가장 처음에 1번 열의 한 칸 왼쪽에 있다. 다음은 1초 동안 일어나는 일이며, 아래 적힌 순서대로 일어난다. 낚시왕은 가장 오른쪽 열의 오른쪽 칸에

www.acmicpc.net


 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
def print_water():
    print("******************")
    print(" r  c  s  d  z")
    for s in shark:
        print(s)
    print()
 
    for w in water:
        print(w)
    print()
 
def move(shark, water):
    # 상어의 좌표를 계산
    for idx in range(len(shark)):
        r, c, s, d, z = shark[idx]
        r -= 1
        c -= 1
        if z in water[r][c]:
 
            nr = r + s * direction[d][0]
            nc = c + s * direction[d][1]
 
            if d == 1 or d == 2:
 
                if 0<=nr<R:
                    pass
 
                else:
                    if nr < 0:
                        nr = abs(nr)
                    if (nr // (R - 1)) % 2 == 0:
                        d = 2
                        nr = 0 + (nr % (R - 1))
                    else:
                        d = 1
                        nr = (R - 1- (nr % (R - 1))
 
            else:
 
                if 0<=nc<C:
                    pass
                else:
                    if nc < 0:
                        nc = abs(nc)
                    if (nc // (C - 1)) % 2 == 0:
                        d = 3
                        nc = 0 + (nc % (C - 1))
                    else:
                        d = 4
                        nc = (C - 1- (nc % (C - 1))
 
            water[r][c].remove(z)  # 기존 상어 위치에서 상어 제거
            water[nr][nc].append(z)  # 새로운 위치로 상어를 옮긴다
            shark[idx] = [nr + 1, nc + 1, s, d, z]  # 상어 정보 업데이트
 
def eat(water, R, C):
    for i in range(R):
        for j in range(C):
            if water[i][j]:
                water[i][j] = [max(water[i][j])]  # 가장 큰 상어만 남긴다.
 
 
R, C, M = map(int, input().split())
shark = [list(map(int, input().split())) for _ in range(M)]
water = [[[] for _ in range(C)] for _ in range(R)]
direction = {1: (-10), 2: (10), 3: (01), 4: (0-1)}
answer = 0
 
if M:
    # 초기화
    for sh in shark:
        r, c, s, d, z = sh
        water[r - 1][c - 1].append(z)
 
    for i in range(C):
        for j in range(R):
            if water[j][i]:
                shk = water[j][i].pop(0)  # 낚시
                answer += shk
                break
        move(shark, water)
        eat(water, R, C)
print(answer)
cs
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python]1248. 맞춰봐  (0) 2019.04.22
[Python]14889. 스타트와 링크  (0) 2019.04.22
[Python]2529. 부등호  (0) 2019.04.16
[Python]17127. 벚꽃이 정보섬에 피어난 이유  (0) 2019.04.14
[Python]15559. 내 선물을 받아줘  (0) 2019.04.14

댓글