fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 17143 (C++) 낚시왕
최초 업로드: 2025-07-30 11:58:19
최근 수정 시간: 2025-07-30 11:58:19
게시자: rlatjwls3333
카테고리: 백준
조회수: 5
# [Gold I] 낚시왕 [문제 링크](https://www.acmicpc.net/problem/17143) ## 문제 설명 <p>낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. 칸에는 상어가 최대 한 마리 들어있을 수 있다. 상어는 크기와 속도를 가지고 있다.</p> <p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/85c2ccad-e4b8-4397-9bd6-0ec73b0f44f8/-/preview/" style="width: 506px; height: 350px;"></p> <p>낚시왕은 처음에 1번 열의 한 칸 왼쪽에 있다. 다음은 1초 동안 일어나는 일이며, 아래 적힌 순서대로 일어난다. 낚시왕은 가장 오른쪽 열의 오른쪽 칸에 이동하면 이동을 멈춘다.</p> <ol> <li>낚시왕이 오른쪽으로 한 칸 이동한다.</li> <li>낚시왕이 있는 열에 있는 상어 중에서 땅과 제일 가까운 상어를 잡는다. 상어를 잡으면 격자판에서 잡은 상어가 사라진다.</li> <li>상어가 이동한다.</li> </ol> <p>상어는 입력으로 주어진 속도로 이동하고, 속도의 단위는 칸/초이다. 상어가 이동하려고 하는 칸이 격자판의 경계를 넘는 경우에는 방향을 반대로 바꿔서 속력을 유지한채로 이동한다.</p> <p>왼쪽 그림의 상태에서 1초가 지나면 오른쪽 상태가 된다. 상어가 보고 있는 방향이 속도의 방향, 왼쪽 아래에 적힌 정수는 속력이다. 왼쪽 위에 상어를 구분하기 위해 문자를 적었다.</p> <p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/d03be3c0-057d-47f7-9808-202ae36a3da3/-/preview/" style="width: 1000px; height: 350px;"></p> <p>상어가 이동을 마친 후에 한 칸에 상어가 두 마리 이상 있을 수 있다. 이때는 크기가 가장 큰 상어가 나머지 상어를 모두 잡아먹는다.</p> <p>낚시왕이 상어 낚시를 하는 격자판의 상태가 주어졌을 때, 낚시왕이 잡은 상어 크기의 합을 구해보자.</p> ## 입력 <p>첫째 줄에 격자판의 크기 R, C와 상어의 수 M이 주어진다. (2 ≤ R, C ≤ 100, 0 ≤ M ≤ R×C)</p> <p>둘째 줄부터 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인 경우는 왼쪽을 의미한다.</p> <p>두 상어가 같은 크기를 갖는 경우는 없고, 하나의 칸에 둘 이상의 상어가 있는 경우는 없다.</p> ## 출력 <p>낚시왕이 잡은 상어 크기의 합을 출력한다.</p> ## 풀이 #### 지문 그대로 구현하면 됩니다. 범위가 작아 쉽게 풀립니다. ``` c++ #include<bits/stdc++.h> using namespace std; int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, 1, -1}; struct shark { int s, d, z; bool operator<(const shark sh) const { return z > sh.z; } }; vector<vector<shark>> board(10000); int main() { ios::sync_with_stdio(0); cin.tie(0); int R, C, M; cin >> R >> C >> M; while(M--) { int r, c, s, d, z; cin >> r >> c >> s >> d >> z; board[(r-1)*C+c-1].push_back({s, d-1, z}); } int sum=0; for(int i=0;i<C;i++) { // 상어 잡기 for(int j=0;j<R;j++) { if(!board[j*C+i].empty()) { sum += board[j*C+i].front().z; board[j*C+i] = {}; break; } } // 상어 이동 vector<vector<shark>> nextBoard(10000); for(int j=0;j<R;j++) { for(int k=0;k<C;k++) { if(board[j*C+k].empty()) continue; shark next = board[j*C+k].front(); int nextJ = (j+next.s*dx[next.d]) % (2*(R-1)); int nextK = (k+next.s*dy[next.d]) % (2*(C-1)); while(nextJ<0 || nextJ>=R) { if(nextJ<0) nextJ = -nextJ; else nextJ = 2*(R-1)-nextJ; if(next.d%2) next.d--; else next.d++; } while(nextK<0 || nextK>=C) { if(nextK<0) nextK = -nextK; else nextK = 2*(C-1)-nextK; if(next.d%2) next.d--; else next.d++; } auto &nextPos = nextBoard[nextJ*C+nextK]; nextPos.push_back(next); sort(nextPos.begin(), nextPos.end()); } } board = nextBoard; } cout << sum; } ```