[C++] BOJ 17837 - ์๋ก์ด ๊ฒ์ 2Problem Solving/Baekjoon Online Judge (BOJ)2025. 4. 17. 14:45
Table of Contents

01. ๐ ๋ฌธ์ ํ์
N: ์ฒด์คํ ํฌ๊ธฐ
K: ๋ง์ ๊ฐ์
NxN ํฌ๊ธฐ๋งํผ ์ฒด์คํ์ ๊ฐ ์นธ์ ์์์ ์
๋ ฅ
K๊ฐ ๋ง์ ์ ๋ณด(x, y, ์ด๋ ๋ฐฉํฅ)๋ฅผ ๊ฐ๊ฐ ์
๋ ฅ
- 1๊ฐ์ ๋ง ์์ ๋ค๋ฅธ ๋ง์ ์ฌ๋ฆด ์ ์์
- ์ฒด์คํ์ ์นธ ์์์ 3์ข
๋ฅ (ํฐ์, ๋นจ๊ฐ์, ํ๋์)
- ๋ค์ ์นธ์ด ํฐ์์ผ ๊ฒฝ์ฐ, ๊ทธ๋๋ก ์ด๋
- ๋ค์ ์นธ์ด ๋นจ๊ฐ์์ผ ๊ฒฝ์ฐ, ๋ง์ ์์๋ฅผ ์ญ์์ผ๋ก ๋ฐ๊พธ์ด ์ด๋
- ๋ค์ ์นธ์ด ํ๋์(๋๋, ๋ฒ์ ๋ฐ)์ผ ๊ฒฝ์ฐ, ๋ง์ ์ด๋ ๋ฐฉํฅ์ ๋ฐ๋ ๋ฐฉํฅ(์ฐ -> ์ข, ์ -> ์๋)๋ก ๋ฐ๊พธ์ด ์ด๋
- ๋ง์ฝ, ๋ฐฉํฅ์ ๋ฐ๊พธ์ด๋ ํ๋์์ผ ๊ฒฝ์ฐ, ์๋ฌด ๊ฒ๋ ์ํํ์ง ์๊ณ ๋๊น
- K๊ฐ์ ๋ง์ ์ฒด์คํ์ ์ฌ๋ฆฌ๊ณ ์์ํ๋ฉฐ, ์ฒ์๋ถํฐ ๋ง์ด ๊ฒน์น๋ ๊ฒฝ์ฐ๋ ์์
- ๋ง์ ์ด๋ ๋ฐฉํฅ์ 4๊ฐ์ง (์ค๋ฅธ์ชฝ, ์ผ์ชฝ, ์, ์๋)
- 1ํด์ K๊ฐ์ ๋ง์ ์์๋๋ก ์ด๋์ํค๋ ๊ฒ์ผ๋ก ์ฆ๊ฐ
- ๋ง์ด ์ด๋ํ ๋, ์์ ์์ฌ์ง ๋ชจ๋ ๋ง๋ค๋ ๊ฐ์ด ์ด๋ํจ
* ์ข ๋ฃ ์กฐ๊ฑด: ํ ์นธ์ ๋ง์ด 4๊ฐ ์ด์ ์์์ ๊ฒฝ์ฐ,
01-1. ๊ฐ๋ฅํ ์๊ฐ ๋ณต์ก๋
- ์๊ฐ ์ ํ 0.5์ด๋ก 5e7๋ฒ์ ์ฐ์ฐ๊น์ง ํ์ฉ
- ๊ฐ ์ด๋์ ๋ํ ์ ์์กฐ์ฌ ์, ์ต์ ์ ๊ฒฝ์ฐ 1000*10^2๋ก 1e5ํ์ ์ฐ์ฐ ํ์๋ก O(1000*K^2) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง
01-2. ์๊ณ ๋ฆฌ์ฆ ์ ํ
- ๋จ์ ์๋ฎฌ๋ ์ด์ ๋ฌธ์ , ์ ์์กฐ์ฌ๋ก๋ ์ถฉ๋ถํ ์๊ฐ ๋ด์ ํด๊ฒฐ ๊ฐ๋ฅ
02. ๐ ์ฝ๋ ์ค๊ณํ๊ธฐ
- ์ฒด์คํ์ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด๊ณผ ๊ฐ ์นธ์ ์์ธ ๋ง์ ์ต๋ ๋์ด๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด ์ฌ์ฉ
- ๊ฐ ๋ง์ ํ์ฌ ์์ ์ ์ ๋ณด(์์น, ์ด๋ ๋ฐฉํฅ, ํ์ฌ ๋์ด)๋ฅผ ์ ์ฅ
- N, K๋ฅผ ์ ๋ ฅํ๊ณ , ์ฒด์คํ NxN์ ๋ํ ๊ฐ ์์, K๊ฐ ๋ง์ ์ ๋ณด(์์น, ๋ฐฉํฅ)๋ฅผ ์ ๋ ฅ๋ฐ์
- ๋ฐ๋ณต๋ฌธ ๋ด์ K๊ฐ์ ๋ง์ ์ด๋์ ์ํํ๋ ๋ฐ๋ณต๋ฌธ์ ์ํ
- ๋ง์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ด๋ ์ํ
- ๋ค์ ์นธ์ด ํฐ์์ผ ๊ฒฝ์ฐ, ์ง๊ธ ๋ง์ ๋์ด์ ํ์ฌ ์นธ์ ๋ง์ ์ต๋ ๋์ด๋ฅผ ๋น๊ตํ์ฌ ์ง๊ธ ๋ง์ ๋์ด์ ๊ฐ๊ฑฐ๋ ๋์ ๋ง๋ค์ ์ ๋ถ ์ด๋
- ๋ค์ ์นธ์ด ๋นจ๊ฐ์์ผ ๊ฒฝ์ฐ, ์ง๊ธ ๋ง์ ๋์ด์ ํ์ฌ ์นธ์ ๋ง์ ์ต๋ ๋์ด๋ฅผ ๋น๊ตํ์ฌ ์ง๊ธ ๋ง์ ๋์ด์ ๊ฐ๊ฑฐ๋ ๋์ ๋ง๋ค์ ์ ๋ถ (ํ์ฌ ์นธ ์ต๋ ๋์ด + ๋ค์ ์นธ ์ต๋ ๋์ด) - ํ์ฌ ์นธ์ ๋์ด๋ก ๊ณ์ฐํ์ฌ ์ด๋
- ํ๋์์ผ ๊ฒฝ์ฐ, ๋ฐฉํฅ์ ๋ฐ๋๋ก ๋ฐ๊พธ๊ณ , ๋ค์ ์นธ์ ์์์ ๊ณ์ฐ ํ, ์ด๋ ์ํ
๋ค์ ํ๋์์ผ ๊ฒฝ์ฐ, ์ด๋ ๋ช ๋ น ๋ฌด์
- ์ด๋ ์ํ ์๋ฃ ํ, ํ์ฌ ๋ง์ด ์์นํ ์นธ์ ๋ง์ ๊ฐ์๊ฐ 4๊ฐ ์ด์์ผ ๊ฒฝ์ฐ, ๋ฐ๋ณต์ ์ข ๋ฃํ๊ณ ์งํ๋ ํด ํ์๋ฅผ ์ถ๋ ฅ
- ๋ง์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ด๋ ์ํ
03. ๐ ๏ธ ์๋๋ณ ์์
1ํ์ฐจ
- ์ ๋ต์ ๋์๋๋ฐ.. ๋๋ฌด ๊น๋ง๋ ์ฝ๋ฉ์ด๋ผ, ๋์ค์ ์คํ์ด๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์ฉํด ๋ง์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๋ค์ ๊ตฌํํด๋ด์ผ๊ฒ ๋ค.
04. ๐๏ธ ์ ๋ต ์ฝ๋
#include <bits/stdc++.h>
using namespace std;
const short WHITE = 0;
const short RED = 1;
const short BLUE = 2;
int N, K;
vector<vector<int>> board(15, vector<int>(15));
vector<vector<int>> level(15, vector<int>(15, 0));
// tuple: {0: pos, 1: dir, 2: level}
vector<tuple<pair<int, int>, int, int>> cpu(11);
// l, r, u, d
int dx[5] = {0, 0, 0, -1, 1};
int dy[5] = {0, 1, -1, 0, 0};
void move(pair<int, int> pos, int& dir, int lv){
int x = pos.first, y = pos.second;
int nx = x + dx[dir], ny = y + dy[dir];
short color = BLUE;
if(nx > 0 && nx <= N && ny > 0 && ny <= N) color = board[nx][ny];
if(color == BLUE){
if(dir % 2 != 0) dir += 1;
else dir -= 1;
nx = x + dx[dir], ny = y + dy[dir];
if(nx > 0 && nx <= N && ny > 0 && ny <= N) color = board[nx][ny];
}
int diff;
switch(color){
case WHITE:
diff = level[nx][ny] - lv;
for(int i = 1; i <= K; i++){
auto& cur_pos = get<0>(cpu[i]);
auto& cur_lv = get<2>(cpu[i]);
if(cur_pos.first == x && cur_pos.second == y){
if(cur_lv >= lv){
level[x][y]--;
cur_pos = {nx, ny}; cur_lv = cur_lv + diff;
level[nx][ny]++;
}
}
}
break;
case RED:
diff = level[x][y] - 1 + level[nx][ny];
for(int i = 1; i <= K; i++){
auto& cur_pos = get<0>(cpu[i]);
auto& cur_lv = get<2>(cpu[i]);
if(cur_pos.first == x && cur_pos.second == y){
if(cur_lv >= lv){
level[x][y]--;
cur_pos = {nx, ny}; cur_lv = diff - cur_lv;
level[nx][ny]++;
}
}
}
break;
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K;
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++) cin >> board[i][j];
}
for(int i = 1, a, b, c; i <= K; i++) {
cin >> a >> b >> c;
cpu[i] = {{a, b}, c, level[a][b]++};
}
int turn = 0;
while(turn <= 1000 ){
bool is_done = false;
for(int i = 1; i <= K; i++){
auto& pos = get<0>(cpu[i]);
int& dir = get<1>(cpu[i]);
int lv = get<2>(cpu[i]);
move(pos, dir, lv);
if(level[pos.first][pos.second] >= 4) {
is_done = true;
break;
}
}
turn++;
if(is_done) break;
}
if(turn > 1000) turn = -1;
cout << turn << "\n";
return 0;
}
'Problem Solving > Baekjoon Online Judge (BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [C++] BOJ 9019 - DSLR (0) | 2025.04.19 |
|---|---|
| [C++] BOJ 23289 - ์จํ๊ธฐ ์๋ ! (0) | 2025.04.18 |
| [C++] BOJ 14890 - ๊ฒฝ์ฌ๋ก (0) | 2025.04.16 |
| [C++] BOJ 14499 - ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ (1) | 2025.04.15 |
| [C++] BOJ 1561 - ๋์ด ๊ณต์ (1) | 2025.04.14 |
@ONE_ :: ์ ํธ์
์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์!