본문 바로가기
Coding Test/BOJ

[백준] 17143 - 낚시왕 [Python(파이썬)]

'삼성 SW 역량 테스트' 기출 문제 입니다. 😀
문제 👉 17143번: 낚시왕

1. 문제

  1. R*C 크기의 격자판에서 낚시왕은 가장 왼쪽 열부터 오른쪽 끝까지 이동한다.
    1. 낚시왕이 오른쪽으로 한 칸 이동한다.
    2. 낚시왕이 있는 열에 있는 상어 중에서 땅과 제일 가까운 상어를 잡는다. 상어를 잡으면 격자판에서 잡은 상어가 사라진다.
    3. 상어가 이동한다.
  2. 상어는 입력으로 주어진 속도로 이동하고, 속도의 단위는 칸/초이다. 상어가 이동하려고 하는 칸이 격자판의 경계를 넘는 경우에는 방향을 반대로 바꿔서 속력을 유지한채로 이동한다.
  3. 상어가 이동을 마친 후 한 칸에 상어가 두 마리 이상 있을 경우 크기가 가장 큰 상어만 남는다.
  4. 낚시왕이 잡은 상어 크기의 합을 출력한다.

2. 풀이

시뮬레이션를 이용한 문제 풀이

  1. 낚시왕이 상어를 잡아먹는 함수를 구현한다.
  2. 상어가 이동하는 함수를 구현한다.
    1. 상어가 원래 자리로 돌아오는 경우 2*(n-1)이다.
    2. 상어의 위치와 속도를 더해 n보다 크거나 같을 경우 방향 전환
    3. 상어의 위치와 속도를 더한 값이 n-1로 나누었을 때 몫이 홀수이면 방향 전환

3. 코드

R, C, M = map(int, input().split())
a = [[0] * C for _ in range(R)]
que = []
for _ in range(M):
    r, c, s, d, z = map(int, input().split())
    a[r-1][c-1] = [s, d, z]
    que.append([r-1, c-1])

di = [[-1,0],[1,0],[0,1],[0,-1]] # 상하우좌

def solution():
    global a, que
    ret, pi, pj = 0, -1, -1

    def direction(d):
        if d == 1: return 2
        elif d == 2: return 1
        elif d == 3: return 4
        else: return 3

    for col in range(C):
        # fishing
        for i in range(R):
            if a[i][col]:
                ret += a[i][col][2]
                a[i][col] = 0
                pi, pj = i, col
                break
        # moving
        arr = [[0] * C for _ in range(R)]
        que2 = []
        for i, j in que:
            if i == pi and j == pj:
                continue
            s, d, z = a[i][j][0], a[i][j][1], a[i][j][2]
            if d < 3: # up/down
                ni, nj = i + s * di[d-1][0], j
                if not 0 <= ni < R:
                    temp = s
                    if d == 1: # 상
                        s -= i
                        i = 0
                    else: # 하
                        s -= R-1 - i
                        i = R-1
                    d = direction(d) # 방향전환
                    xx, yy = divmod(s, R-1)
                    if xx % 2 == 0:
                        if i == 0:
                            ni = yy # 위에서 아래로
                        else:
                            ni = R-1 - yy # 아래서 위로
                    else: # 반대 방향
                        if i == 0:
                            ni = R-1 - yy
                        else:
                            ni = yy
                        d = direction(d) # 방향전환
                    s = temp
            else: # left/right
                ni, nj = i, j + s * di[d-1][1]
                if not 0 <= nj < C:
                    temp = s
                    if d == 3: # 우
                        s -= C-1 - j
                        j = C-1
                    else: # 좌
                        s -= j
                        j = 0
                    d = direction(d)
                    xx, yy = divmod(s, C-1)
                    if xx % 2 == 0:
                        if j == 0:
                            nj = yy
                        else:
                            nj = C-1 - yy
                    else:
                        if j == 0:
                            nj = C-1 - yy
                        else:
                            nj = yy
                        d = direction(d)
                    s = temp
            if arr[ni][nj]:
                if z > arr[ni][nj][2]: # 더 큰 상어가 있을 때
                    arr[ni][nj] = [s, d, z]
            else:
                arr[ni][nj] = [s, d, z]
                que2.append([ni, nj])
        a = arr
        que = que2
    return ret                    
print(solution())
  • 결과 : 2232 ms

References

  •  

🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋

댓글