본문 바로가기
알고리즘/백준

[백준 17143] 낚시왕 (C++)

by Bloofer 2020. 6. 7.

A. 문제설명

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

문제에 대한 자세한 설명은 링크 참조

 

1. 크기가 R*C인 지도가 존재

2. 해당 지도 위 각 칸에 상어가 존재하는데, 각각의 상어는 크기/방향/속력 정보를 가짐

3. 낚시왕은 처음 1열에 위치해있다가 오른쪽으로 한칸씩 이동하며 해당 열의 가장 상단의 상어를 잡는다.

4. 낚시 후 상어들이 현재 위치에서 주어진 방향으로 속도만큼 이동하는데, 여기서 벽을 만나면 방향은 반대로 바꾸고 속력을 유지한채로 이동한다.
5. 낚시왕이 끝열까지 이동하면서 잡을 수 있는 상어의 크기의 합 구하기

 

B. 접근법

시뮬레이션

 

낚시왕이 1~C 행까지 이동할 동안 상어의 이동 시뮬레이션 함수를 구현하여 움직임을 모사한다. 여기서 까다로운 점은 상어가 벽을 만나면 방향을 바꾸고 반대쪽으로 이동을 진행한다는 점인데, 상어는 벽을 만나면 제자리에서 도는게 아니라 방향을 바꿔 한칸 더 나아간다. 해당 조건에 유의하여 함수를 구현하도록 한다.

 

C. 풀이

0. R*C 크기의 2차원 벡터배열(vector<int> arr[100][100])을 이용, 각 좌표내 상어 정보를 저장한다.

1. 낚시왕은 이동하여 해당 열의 가장 위쪽 상어를 찾고, 있으면 전체 Sum에 추가, 잡은 상어는 제거

2. 상어 이동

2-1. 이동방향을 보고, 이동방향이 1/2인 경우 다음 행을 움직임, 3/4인 경우 다음 열을 움직임

2-2. 남은 이동거리를 S로 놓고 벽 만나면 방향 전환되며 이동
      방향이 1/2일때 (S - row) / (R - 1) 만큼 방향전환, (S - row) % (R - 1) 만큼 이동

2-3. 이동 후에는 해당 좌표의 벡터에서 상어 빼고, 새 좌표의 벡터에 삽입

3. 이동한 인덱스의 벡터에 상어가 여러마리 있는경우 그 중 크기가 가장 큰 놈만 남기고 다 죽임

 

D. 내 코드