BOJ 17143. ๋์์
๐โโ๏ธ[Gold I] ๋์์ - 17143
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2352 KB, ์๊ฐ: 152 ms
๋ถ๋ฅ
๊ตฌํ, ์๋ฎฌ๋ ์ด์
์ ์ถ ์ผ์
2024๋ 2์ 17์ผ 04:06:56
๋ฌธ์ ์ค๋ช
๋์์์ด ์์ด ๋์๋ฅผ ํ๋ ๊ณณ์ ํฌ๊ธฐ๊ฐ RรC์ธ ๊ฒฉ์ํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๊ฒฉ์ํ์ ๊ฐ ์นธ์ (r, c)๋ก ๋ํ๋ผ ์ ์๋ค. r์ ํ, c๋ ์ด์ด๊ณ , (R, C)๋ ์๋ ๊ทธ๋ฆผ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋์ ์๋ ์นธ์ด๋ค. ์นธ์๋ ์์ด๊ฐ ์ต๋ ํ ๋ง๋ฆฌ ๋ค์ด์์ ์ ์๋ค. ์์ด๋ ํฌ๊ธฐ์ ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋์์์ ์ฒ์์ 1๋ฒ ์ด์ ํ ์นธ ์ผ์ชฝ์ ์๋ค. ๋ค์์ 1์ด ๋์ ์ผ์ด๋๋ ์ผ์ด๋ฉฐ, ์๋ ์ ํ ์์๋๋ก ์ผ์ด๋๋ค. ๋์์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์ด์ ์ค๋ฅธ์ชฝ ์นธ์ ์ด๋ํ๋ฉด ์ด๋์ ๋ฉ์ถ๋ค.
- ๋์์์ด ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋ํ๋ค.
- ๋์์์ด ์๋ ์ด์ ์๋ ์์ด ์ค์์ ๋ ๊ณผ ์ ์ผ ๊ฐ๊น์ด ์์ด๋ฅผ ์ก๋๋ค. ์์ด๋ฅผ ์ก์ผ๋ฉด ๊ฒฉ์ํ์์ ์ก์ ์์ด๊ฐ ์ฌ๋ผ์ง๋ค.
- ์์ด๊ฐ ์ด๋ํ๋ค.
์์ด๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์๋๋ก ์ด๋ํ๊ณ , ์๋์ ๋จ์๋ ์นธ/์ด์ด๋ค. ์์ด๊ฐ ์ด๋ํ๋ ค๊ณ ํ๋ ์นธ์ด ๊ฒฉ์ํ์ ๊ฒฝ๊ณ๋ฅผ ๋๋ ๊ฒฝ์ฐ์๋ ๋ฐฉํฅ์ ๋ฐ๋๋ก ๋ฐ๊ฟ์ ์๋ ฅ์ ์ ์งํ์ฑ๋ก ์ด๋ํ๋ค.
์ผ์ชฝ ๊ทธ๋ฆผ์ ์ํ์์ 1์ด๊ฐ ์ง๋๋ฉด ์ค๋ฅธ์ชฝ ์ํ๊ฐ ๋๋ค. ์์ด๊ฐ ๋ณด๊ณ ์๋ ๋ฐฉํฅ์ด ์๋์ ๋ฐฉํฅ, ์ผ์ชฝ ์๋์ ์ ํ ์ ์๋ ์๋ ฅ์ด๋ค. ์ผ์ชฝ ์์ ์์ด๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ๋ฌธ์๋ฅผ ์ ์๋ค.
์์ด๊ฐ ์ด๋์ ๋ง์น ํ์ ํ ์นธ์ ์์ด๊ฐ ๋ ๋ง๋ฆฌ ์ด์ ์์ ์ ์๋ค. ์ด๋๋ ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ์์ด๊ฐ ๋๋จธ์ง ์์ด๋ฅผ ๋ชจ๋ ์ก์๋จน๋๋ค.
๋์์์ด ์์ด ๋์๋ฅผ ํ๋ ๊ฒฉ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๋์์์ด ์ก์ ์์ด ํฌ๊ธฐ์ ํฉ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒฉ์ํ์ ํฌ๊ธฐ R, C์ ์์ด์ ์ M์ด ์ฃผ์ด์ง๋ค. (2 โค R, C โค 100, 0 โค M โค RรC)
๋์งธ ์ค๋ถํฐ 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์ธ ๊ฒฝ์ฐ๋ ์ผ์ชฝ์ ์๋ฏธํ๋ค.
๋ ์์ด๊ฐ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ๋ ์๊ณ , ํ๋์ ์นธ์ ๋ ์ด์์ ์์ด๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
๋์์์ด ์ก์ ์์ด ํฌ๊ธฐ์ ํฉ์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
๋ฌธ์ ์ ํฌ์ธํธ๋ ์๊ฐ์ด๊ณผ๊ฐ ์๋๊ฒ ํ์ด์ผํ๋ค๋ ๊ฒ์ด๋ค.
์์ด๊ฐ ์ด๋ํ๋๊ฒ ์ต์ํ์ผ๋ก ์์ง์ด๊ฒ ๋ง๋ค์ด์ผํ๋ค.
์์ด์ ์๋๊ฐ ๋งค์ฐ ๋์์ ๋งต์ ๋ฐ๋ณตํด์ ์์ง์ธ๋ค๋ฉด ์ค๋ณต๋๋ ๊ฐ์ ์์จ์์๋ค.
R, C ๋ณด๋์์ ์์ด๊ฐ ๋ฐ๋ณต๋๋๊ฑธ ์์ ๋ ค๋ฉด
s = s % ((R - 1) * 2)
๋ก ๋ฐฉํฅ์ด R๋ผ์ธ์ผ ๋ ์ด๋ ๊ฒ ๊ณ ์น ์ ์๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก C ๋ฐฉํฅ์ด๋ผ๋ฉด
s = s % ((C - 1) * 2)
๋ก ๊ณ ์น ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์์ด๊ฐ ๋ค ์์ง์ด๊ณ ์์ด๋ฅผ ์ก์๋จน๋๋ค๋ฉด ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค.
M์ ์ต๋ 10000์ด๋ผ์ ๋ง๋ฒ * ๋ง๋ฒ์ ๋๋ฉด ์๊ฐ์ด ๋๋ฌด ์ค๋๊ฑธ๋ฆฐ๋ค.
๊ทธ๋์ ์์ด๊ฐ ์ด๋ํ์๋ง์ ๋จน๋ ๊ฒ์ ํด์ผํ๋๋ฐ ๋ง๋ ์์ด๊ฐ ์ด๋ํ ํ ์์ด์ธ์ง ์ด๋ ์ ์์ด์ธ์ง ์์์ผํ๋ค.
// ์ด๋์ ์๋ฃํ ์์ด์ธ์ง ์๋์ง ํ๋ณํด์ผํจ
if (board[y][x] == 0)
{
board[y][x] = i;
sharks[i].r = y;
sharks[i].c = x;
}
else if (board[y][x] < i)
{
if (sharks[board[y][x]].z > sharks[i].z)
{
removeShark(i);
}
else
{
removeShark(board[y][x]);
board[y][x] = i;
sharks[i].r = y;
sharks[i].c = x;
}
}
๊ทธ๋์ ๊ฐ ์์ด๋ง๋ค ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฏ๋ก ๊ทธ๊ฒ์ ํตํด์ ํ๋ณํ๋ค.
์์ด๊ฐ ์์ง์ด๋ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
void moveShark()
{
for (int i = 0; i < sharks.size(); ++i)
{
if (sharks[i].r == 0)
continue;
int y = sharks[i].r;
int x = sharks[i].c;
//board[y][x] = 0; // ์๋ฆฌ๋ฅผ ๋ ๋ฌ๋ค.
for (int j = 0; j < sharks[i].s; ++j)
{
int ny = y + dy[sharks[i].d];
int nx = x + dx[sharks[i].d];
if (ny < 1 || nx < 1 || ny > R || nx > C)
{
if (sharks[i].d == 1 || sharks[i].d == 3)
{
sharks[i].d++;
ny = y + dy[sharks[i].d];
nx = x + dx[sharks[i].d];
}
else if (sharks[i].d == 2 || sharks[i].d == 4)
{
sharks[i].d--;
ny = y + dy[sharks[i].d];
nx = x + dx[sharks[i].d];
}
}
y = ny;
x = nx;
}
// ์ด๋์ ์๋ฃํ ์์ด์ธ์ง ์๋์ง ํ๋ณํด์ผํจ
if (board[y][x] == 0)
{
board[y][x] = i;
sharks[i].r = y;
sharks[i].c = x;
}
else if (board[y][x] < i)
{
if (sharks[board[y][x]].z > sharks[i].z)
{
removeShark(i);
}
else
{
removeShark(board[y][x]);
board[y][x] = i;
sharks[i].r = y;
sharks[i].c = x;
}
}
}
//printBoard();
for (int i = 0; i < sharks.size(); ++i)
{
board[sharks[i].r][sharks[i].c] = 0;
}
}
๋ง์ง๋ง์ ์์ด์ ์ธ๋ฑ์ค๋ฅผ ๋ค ์ง์์ ํ์ ์ ๋จ๊ธฐ์ง ์๊ฒ ๋ง๋ค์๋ค.
์์ด๋ฅผ ์์ ๋ ๊ฑด ์์ด์ ์ ๋ณด๋ฅผ ๋ชจ๋ 0์ผ๋ก ๋ง๋ค์๋ค.
์๋ํ๋ฉด vector๋ก ์์ด๋ฅผ ๋ด๊ณ ์๋๋ฐ ์ ๋ง๋ก ์ง์ฐ๊ฒ ๋๋ค๋ฉด ์ธ๋ฑ์ค ๋ฌธ์ ๋ ์์ ๋ฟ๋ง์๋๋ผ ๋ณต์ฌ ๊ณผ์ ์ด ์์ผ๋ฏ๋ก ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ๋๋ฌธ์ด๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
struct Shark
{
int r, c, s, d, z;
bool operator<(const Shark other)
{
if (r < other.r)
return true;
return false;
}
};
void setting();
void solve();
void moveShark();
void removeShark(int idx);
void printBoard();
// 1. ๋์์์ด ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋
// 2. ๋์์์ด ์๋ ์ด์ ์๋ ์์ด ์ค์์ ๋
๊ณผ ์ ์ผ ๊ฐ๊น์ด ์์ด๋ฅผ ์ก๋๋ค. ์์ด๋ฅผ ์ก์ผ๋ฉด ๊ฒฉ์ํ์์ ์ก์ ์์ด๊ฐ ์ฌ๋ผ์ง๋ค.
// 3. ์์ด๊ฐ ์ด๋ํ๋ค.
int R, C, M, r, c, s, d, z, res = 0;
int dy[] = { 0, -1, 1, 0, 0 };
int dx[] = { 0, 0, 0, 1, -1 };
vector<vector<int>> board;
vector<Shark> sharks;
void setting()
{
cin >> R >> C >> M;
board = vector<vector<int>>(R + 1, vector<int>(C + 1));
sharks = vector<Shark>(M + 1);
sharks[0].r = 0;
sharks[0].c = 0;
sharks[0].s = 0;
sharks[0].d = 0;
sharks[0].z = 0;
for (int i = 1; i <= M; ++i)
{
cin >> r >> c >> s >> d >> z;
sharks[i].r = r;
sharks[i].c = c;
sharks[i].s = s;
sharks[i].d = d;
sharks[i].z = z;
if (d <= 2)
{
sharks[i].s = s % ((R - 1) * 2);
}
else if (d >= 3)
{
sharks[i].s = s % ((C - 1) * 2);
}
}
}
void moveShark()
{
for (int i = 0; i < sharks.size(); ++i)
{
if (sharks[i].r == 0)
continue;
int y = sharks[i].r;
int x = sharks[i].c;
//board[y][x] = 0; // ์๋ฆฌ๋ฅผ ๋ ๋ฌ๋ค.
for (int j = 0; j < sharks[i].s; ++j)
{
int ny = y + dy[sharks[i].d];
int nx = x + dx[sharks[i].d];
if (ny < 1 || nx < 1 || ny > R || nx > C)
{
if (sharks[i].d == 1 || sharks[i].d == 3)
{
sharks[i].d++;
ny = y + dy[sharks[i].d];
nx = x + dx[sharks[i].d];
}
else if (sharks[i].d == 2 || sharks[i].d == 4)
{
sharks[i].d--;
ny = y + dy[sharks[i].d];
nx = x + dx[sharks[i].d];
}
}
y = ny;
x = nx;
}
// ์ด๋์ ์๋ฃํ ์์ด์ธ์ง ์๋์ง ํ๋ณํด์ผํจ
if (board[y][x] == 0)
{
board[y][x] = i;
sharks[i].r = y;
sharks[i].c = x;
}
else if (board[y][x] < i)
{
if (sharks[board[y][x]].z > sharks[i].z)
{
removeShark(i);
}
else
{
removeShark(board[y][x]);
board[y][x] = i;
sharks[i].r = y;
sharks[i].c = x;
}
}
}
//printBoard();
for (int i = 0; i < sharks.size(); ++i)
{
board[sharks[i].r][sharks[i].c] = 0;
}
}
void removeShark(int idx)
{
sharks[idx].r = 0;
sharks[idx].c = 0;
sharks[idx].d = 0;
sharks[idx].s = 0;
sharks[idx].z = 0;
}
void printBoard()
{
for (int i = 1; i <= R; ++i)
{
for (int j = 1; j <= C; ++j)
{
cout << board[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void solve()
{
setting();
// ์ฃผ์ธ๊ณต์ 1๋ถํฐ C๊น์ง ์ด๋
for (int pos = 1; pos <= C; ++pos)
{
// ์์ด ์ก๊ธฐ
pair<int, int> temp = { 1000, 1000 }; // ์ธ๋ฑ์ค, r๊ฐ
for (int k = 0; k < sharks.size(); ++k)
{
if (sharks[k].c == pos)
{
if (sharks[k].r < temp.second)
{
temp.first = k;
temp.second = sharks[k].r;
}
}
}
if (temp.first != 1000)
{
res += sharks[temp.first].z;
removeShark(temp.first);
}
moveShark();
}
cout << res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}