https://softeer.ai/practice/7727
ํ๋ ์ํํฐ์ด Lv3. ํจ๊ปํ๋ ํจ๋ C++ ํ์ด
๊ฝค๋ ๊น๋ค๋ก์ ๋ ๋ฌธ์ ์ด๋ค.
์ฝํ ๊ณต๋ถ๋ฅผ ๋ค์ ์์ํ๋ฉด์ ์ฒ์์ผ๋ก ํผ ๋ฌธ์ ์ธ๋ฐ,
์ด์ฌํ ๊ณ ๋ฏผํ๋ฉด์ ํ๋ค๋ณด๋ ์์ ์ค๋ ฅ์ด ๊ธ๋ฐฉ ๋์์จ ๋๋์ด๋ค
1. ์ด์(ํ ์ผ๋ง ๋ง์)
- ์บ๋ฆญํฐ ๊ทผ์ฒ์ 4๋ฐฉํฅ ํ์ ํ, max๊ฐ์ผ๋ก ์ด๋ → 3์ด ํ ์ ์งํ๋๋ก ํจ
- ๊ทผ๋ฐ ์๋ชป๋ ๋ฐฉ๋ฒ์ด์์!!! 3๋ฒ ์ด๋ํ๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๊ณ , ๊ทธ ์ค max๊ฐ์ ์ป๋ ๊ฒฝ์ฐ๋ฅผ ๋ฆฌํดํด์ผํจ
- grid ๋ณต์ฌํด์ ์ฌ๋ฌ๋ช ์ง๋๊ฐ๋ ๋ฃจํธ ์ฒดํฌ, visited๋ก ํ๋ช ์ง๋๊ฐ๋ ๋ฃจํธ ์ฒดํฌ
์๋ ์ฝ๋๋ ๋น๊ต์ ์ฌ์ด bfs๋ก ๊ฒฝ๋ก๋ฅผ ํ์ํ ์ด์์ ๋๋ค....ํ ์ผ๋ ๋ง์์ง๋ง ์ ์ถํด๋ณด๋ ์คํจ.
์์ ํ๋ค๊ฐ dfs๋ก ํ์ด์ผํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ฃ
int findMax(int X, int Y, int grid[20][20]){
int x = X-1;
int y = Y-1;
queue<pair<int,int>> q;
int fruit = grid[x][y];
int nx=0; int ny=0; int maxtree = 0;
int cnt = 0;
grid[x][y] = 0; // ํ์ฌ ์์น๋ ์ด๋งค ๋ฐ์ผํจ
q.push({x,y});
while(cnt < 3){
pair<int,int> p = q.front();
q.pop();
maxtree = 0;
for(int i=0; i<4; ++i){
int mx = p.first + move_x[i];
int my = p.second + move_y[i];
if(canMove(mx,my) && (maxtree < grid[mx][my])){
maxtree = grid[mx][my];
nx = mx; ny = my;
}
}
q.push({nx,ny});
fruit += maxtree;
grid[nx][ny] = 0;
cnt ++;
}
return fruit;
}
์ dfs๋ก ํด์ผํ๋?
-> ๊น์ด ์ฐ์ ์ผ๋ก 3์ด๋์ ๋๊น์ง ์์ง์ด๋ ๋ชจ๋ ๋ฃจํธ๋ฅผ ํ์ํด์ผํจ!
3์ด๋์ ์ฒซ๋ฒ์งธ ๋ฃจํธ์์ ๋ธ ์ ์๋ ์ด๋งค์ sum์ ๊ตฌํ๊ณ ,
๋ค์ ์ถ๋ฐ์ ์ผ๋ก ๋์์์
๋๋ฒ์งธ ๋ฃจํธ์์ ๋ธ ์ ์๋ ์ด๋งค์ sum์ ๊ตฌํ๊ณ ,
... ๋ฐ๋ณต
๊ทธ๋ฆฌ๊ณ ์น๊ตฌ 1, ์น๊ตฌ2๊ฐ ์์๋ ์์ด๋ก ์์๋ฅผ ๋ฐ๊ฟ์ ๋ฐ๋ณตํ๋๊ฒ ๊น์ง๋ ์บ์นํ๋๋ฐ
๊ฐ ์น๊ตฌ์ ์ด๋งค max๋ฅผ ๊ตฌํ๊ณ
๊ทธ max ๊ฒฝ๋ก๋ง ์ ์ฅํด์ ์ด๋งค ์๋ฅผ 0์ผ๋ก ๋ง๋ค์ด์ผ ํ์! (์ด๋ฏธ ์ด๋งค๋ฅผ ๋ด ๋๋ฌด)
์ฒ์ ๋ดค์ ๋ ์ฌ์๋ณด์ด๋ ๋ฌธ์ ์๋๋ฐ, ๊ตฌํ์ด ์๊ฐ๋ณด๋ค ๋นก์ ๋ค
2. ํ์ด
dfs์์ current_fruit ์ ๋ฌํ๊ณ , max fruit์ด ๊ฐฑ์ ๋ ๋๋ง bestPath๋ฅผ ์ ์ฅํ๋๋ฐ ๋ญ๊ฐ ์ด์ํด์ ์ถ๋ ฅํด๋ณด๋
์ง์ญ๋ณ์ ๋น๊ต๊ฐ ์๋ชป๋๊ณ ์๋์ง ๊ทธ๋ฅ ๋๋ฆฌ๋ ์กฑ์กฑ ์์ฐจ์ ์ผ๋ก ๊ฐ์ด ๊ฐฑ์ ๋๊ธธ๋
fruit ์ต๋๊ฐ์ด ๋์ฌ ๋๋ง๋ค ์ ์ญ๋ณ์ ๋ฒกํฐ์ ํธ์ํด์, vector.back() ๊ฐ์ ๋น๊ตํ๋๋ก ์์ ํ๋ค.
→ max์ผ๋์ ๊ฒฝ๋ก๊ฐ ์ ์ ์ฅ๋จ. ์ ์ญ ๋ฒกํฐ๊ฐ ๋ต์ด์๋ค…………
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int grid[20][20] = {0,};
int tmp[20][20] = {0,};
bool visited[20][20] = {false,};
bool route[20][20] = {false,};
int n; int m;
int move_x[4] = {0,1,0,-1};
int move_y[4] = {1,0,-1,0};
vector<pair<int, int>> bestPath;
vector<pair<int, int>> currentPath;
vector<int> results;
bool canMove(int nx, int ny){
if(nx<0 || nx>=n || ny<0 || ny>=n) return false;
return true;
}
int dfs(int x, int y, int time, int current_fruit) {
if (time >= 3) {
return current_fruit;
}
int max_fruit = current_fruit;
for (int i = 0; i < 4; ++i) {
int mx = x + move_x[i];
int my = y + move_y[i];
if (canMove(mx, my) && !visited[mx][my]) {
int fruit = grid[mx][my];
visited[mx][my] = true;
currentPath.push_back({mx, my});
int total_fruit = dfs(mx, my, time + 1, current_fruit + fruit);
if (results.back() < total_fruit) {
results.push_back(total_fruit); // ์ด๊ฑฐ์์!!!!!!!!!
max_fruit = total_fruit;
if (time == 2) {
bestPath = currentPath;
// cout << max_fruit<<"/";
// for(auto i:bestPath) cout << i.first<<","<<i.second<<"\n";
}
}
currentPath.pop_back();
visited[mx][my] = false;
}
}
return results.back();
}
int findMax(int x, int y){
// cout << x<<","<<y<<")\n";
int start_fruit = grid[x][y];
visited[x][y] = 1;
grid[x][y] = 0;
results.push_back(start_fruit);
int max_fruit = dfs(x, y, 0, start_fruit);
visited[x][y] = 0;
for(auto i:bestPath){
// cout <<"("<< i.first<<"," << i.second<<") ";
grid[i.first][i.second] = 0;
}
currentPath.clear();
return max_fruit;
}
int main(int argc, char** argv)
{
int friends[3][3] = {0,};
int answer = 0;
cin >> n >> m;
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j) {
cin >> grid[i][j];
}
}
for(int i=0; i<m; ++i) cin >> friends[i][0] >> friends[i][1];
memcpy(tmp, grid, sizeof(grid));
vector<int> mlist;
for(int i=0; i<m; ++i) mlist.push_back(i);
do {
int max = 0;
memcpy(grid, tmp, sizeof(tmp));
for (int j = 0; j < m; ++j) {
int fr = mlist[j];
max += findMax(friends[fr][0]-1, friends[fr][1]-1);
// cout << max << "///----\n\n";
}
if (answer < max) answer = max;
} while (next_permutation(mlist.begin(), mlist.end())); // ์๋ชป๋ ๊ณต๋ฐฑ ๋ฌธ์ ์์
cout << answer;
return 0;
}
ํด ์ค๋๋ง์ n์๊ฐ ์์ญ~~
'๐ ์๊ณ ๋ฆฌ์ฆ > Softeer' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Javascript(NodeJS)/Softeer] Lv1. A+B (0) | 2024.06.27 |
---|---|
[Javascript(NodeJS)/Softeer] Lv1. ๊ทผ๋ฌด ์๊ฐ (0) | 2024.06.27 |
[C++/Softeer] Lv3. ์์๋๋ก ๋ฐฉ๋ฌธํ๊ธฐ (HSAT 7ํ ์ ๊ธฐ ์ฝ๋ฉ ์ธ์ฆํ๊ฐ ๊ธฐ์ถ) (0) | 2024.06.27 |
[C++/Softeer] Lv2. ํ์์ค ์์ฝ (0) | 2024.06.27 |
[C++/Softeer] Lv1. ์ํํ ํจ๋ (0) | 2024.06.26 |