728x90
17143번: 낚시왕
낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다.
www.acmicpc.net
🤔 문제분석
행과 열을 이동할때 어떤식으로 빠르게 이동하게 만들 것인가의 문제를 찾는 것이 핵심이다. Speed 값이 크기때문에 한바퀴만 돌 수 있는 것을 구하면 된다.
열은 (R-1) * 2 의 나눈나머지 값을 구한다면 한바퀴 미만 값의 가중치가 나온다. 행도 마찬가지로 (C-1) * 2를 나눈 나머지 값으로 갱신시킨다.
if direction == UP or direction == DOWN:
speed = speed % ((R-1)*2)
else:
speed = speed % ((C-1)*2)
나머지의 문제는 주어진 조건에 따라서 구현을 하면 문제를 해결 할 수 있다.
📝 의사코드
- 상어를 잡는다 ( 낚시 한다 )
- 상어가 움직인다 ( 움직일때 가장 큰 상어가 상어를 먹는다 )
- 1과 2를 반복한다. ( 낚시왕이 끝에 도달했을경우까지 반복한다 )
- 상어를 잡은 가중치의 누산값을 출력한다.
💻 코드
import sys
input = sys.stdin.readline
UP = 1
DOWN = 2
RIGHT = 3
LEFT = 4
dy = [0, -1, 1, 0, 0]
dx = [0, 0, 0, 1, -1]
R, C, M = map(int, input().split())
table = [[[0] for _ in range(C+1)] for _ in range(R+1)]
def is_range(y, x):
return R >= y >= 1 and C >= x >=1
def chage_direction(direction):
if direction == UP:
return DOWN
elif direction == DOWN:
return UP
elif direction == RIGHT:
return LEFT
else:
return RIGHT
def move(y, x, speed, direction):
if direction == UP or direction == DOWN:
speed = speed % ((R-1)*2)
else:
speed = speed % ((C-1)*2)
ny, nx = y, x
for _ in range(speed):
ny += dy[direction]
nx += dx[direction]
if is_range(ny, nx):
continue
else:
ny -= dy[direction]
nx -= dx[direction]
direction = chage_direction(direction)
ny += dy[direction]
nx += dx[direction]
return ny, nx, direction
def move_shark(table):
new_table = [[[0] for _ in range(C+1)] for _ in range(R+1)]
for i in range(1, R+1):
for j in range(1, C+1):
if len(table[i][j]) >= 2:
speed, direction, size = table[i][j]
n_y, n_x, direction = move(i, j, speed, direction)
if len(new_table[n_y][n_x]) == 1:
new_table[n_y][n_x] = [speed, direction, size]
else:
if size > new_table[n_y][n_x][2]:
new_table[n_y][n_x] = [speed, direction, size]
return new_table
def catch_shark(x):
for i in range(1, R+1):
if len(table[i][x]) >= 2:
size = table[i][x][2]
table[i][x] = [0]
return size
return 0
for _ in range(M):
y, x, s, d, z = map(int, input().split())
table[y][x] = [s, d, z] # (r, c)는 상어의 위치, s는 속력, d는 이동 방향, z는 크기
ans = 0
for x in range(1, C+1):
cost = catch_shark(x)
ans += cost
table = move_shark(table)
print(ans)
🎯 피드백 및 개선사항
처음에 문제를 해결 할때에 어떤식으로 빠르게 이동 할 것 인가를 생각하는데에 시간을 많이 빼앗겼다. 여기서 문제를 해결하는 접근 방식이 문제를 해결하는데 있어서 복잡성을 가져왔고, 다른사람의 풀이를 참조하여 빠르게 이동하는 방법을 파악하였습니다. 구현문제를 풀때에는 절대로 손이 먼저 가지 말고 문제를 천천히 분석하고, 정확한 분석이 끝나면 그때서야 손이 가야합니다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2933번 : 미네랄 (1) | 2024.01.31 |
---|---|
[백준] 1113번 : 수영장 만들기 (1) | 2024.01.31 |
[백준] 1509번 : 펠린드롬 분할 (2) | 2024.01.28 |
[백준] 2056번 : 작업 (0) | 2024.01.28 |
[백준] 2169번 : 로봇 조종하기 (1) | 2024.01.24 |