https://school.programmers.co.kr/learn/courses/30/lessons/87694
*๋ฌธ์ ์ค๋ช
์ง์ฌ๊ฐํ๋ค์ด x,y ์ขํ์ ๋์ฌ ์์ ๋, ์บ๋ฆญํฐ๊ฐ ๊ฐ์ฅ์๋ฆฌ๋ง ์ด๋ํ๋ฉด์ ์์ดํ ์ด ์๋ ์์น๊น์ง ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์์๋ด๋ ๋ฌธ์ ์ด๋ค. ๋ ์ฌ๊ฐํ์ด ๊ผญ์ง์ ์์ ๋ง๋๋๊ฑฐ๋ ๋ณ์ด ๊ฒน์น๊ฑฐ๋ ์์ ๋ถ๋ฆฌ๋๊ฑฐ๋ ์์ ํ ํฌํจ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
*๋ฌธ์ ์์
๋ฌธ์ ์ ๋ ฅ์ rectangle์ ์์/๋ x,y ์ขํ๊ฐ ๋ด๊ธด ๋ฐฐ์ด๊ณผ ์บ๋ฆญํฐ์ x,y์ขํ, ์์ดํ ์ x,y ์ขํ ๊ฐ์ด ์ฃผ์ด์ง๋ค.
๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๋ฆฌํดํ๋ฉด ๋๋ค.
์ ์ถ๋ ฅ ์์์ 1,2,3 ๋ฒ ๋ต์ ์์ ๊ฐ๋ค. ๋นจ๊ฐ์์ด ์บ๋ฆญํฐ ์์น, ํ๋์์ด ์์ดํ ์์น์ด๋ค. ๋นจ๊ฐ์ ์บ๋ฆญํฐ์ง์ ์์ ํ๋์ ์์ดํ ์ง์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ ์ผ์ชฝ์ผ๋ก ๊ฐ๋, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ ๊ฐ์ฅ ์งง์ ํ๊ฐ์ง ๊ฒฝ์ฐ์ด๋ค.
*ํ์ด๋ฐฉ๋ฒ
1) ์ฐ์ board ๋ฅผ ํ๋ ๋ง๋ค์ด์ ์ฃผ์ด์ง ์ง์ฌ๊ฐํ๋ค์ board์ ๋๋ ์์ ์ด ํ์ํ๋ค. board์ ๋์ฌ์๋ค๊ณ ํํํ๊ธฐ ์ํด 1์ ๋ฃ์ด์ค๋ค.
2) ๋ชจ๋ ์ง์ฌ๊ฐํ์ ๋์์ผ๋ฉด ์ง์ฌ๊ฐํ ๋ด๋ถ๋ฅผ 0์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
3) ์บ๋ฆญํฐ ์์น์์ ์์ํด์ ์์ดํ ์์น์ ๋๋ฌํ ๋๊น์ง BFS ํ์์ ์งํํ๋ค.
1) 2) 3) ๋ฐฉ๋ฒ์ ๋จธ๋ฆฌ์์ผ๋ก๋ ๋๋ ์ฝ๋๋ก ์ฎ๊ธฐ๊ธฐ ์ฝ์ง ์์๋ค. ์์ค์ ๊ฒ์ํด์ ์ฐพ์๋ณด๋ ๋ชจ๋ ์ขํ๊ฐ๋ค์ 2๋ฐฐ์ฒ๋ฆฌํ์ฌ ๊ฒน์น๋ ๋ถ๋ถ์ ํด๊ฒฐํด์ผ ํ๋ค๊ณ ํ๋ค.
์์ผ๋ก ๊ทธ๋ ค๋ณด๋ ์ดํด๊ฐ ๊ฐ๋ค. ๋๊ทธ๋ผ๋ฏธ ์น ๋ถ๋ถ์ด ์์๋ ๊ฐ์ ๋ถ๋ถ์ธ๋ฐ ์ ์ขํ๊ณ์ ๋ฌ๋ฆฌ ์์ ํ ๊ฒน์ณ์ ์ ํํ ํ์์ด ๋ถ๊ฐ ํ๋ค. ๋, x,y ์ขํ๊ณ๋ฅผ board์ ํ์ด๋ก ํํํ๋ x,y ์ขํ๊ฐ ๋ฐ๋๋ผ์ x,y ๊ฐ์ ๋ฐ๋๋ก ๋ฃ์ด์ฃผ์๋ค.
*์์๋๊ฒ
1) queue์ emplace ํจ์
- C++ 11์์ ์ฒ์ ์ถ๊ฐ๋์๋ค.
- queue๋ map์ ๊ฐ์ ๋ฃ์ ๋ make_pair๋ make_tuple์ ์ด์ฉํ์ง ์๊ณ emplace ํจ์๋ก ๊ฐ๋จํ๊ฒ ์ถ๊ฐํ ์ ์๋ค.
- push์ ๋ฌ๋ฆฌ ๋ฐ๋ก ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๋ฉด์ ๋ฃ๊ธฐ์ copy & move ์ฐ์ฐ์ ๋ฐ๋ก ์ํํ์ง ์์ ์ฐ์ฐ๋น์ฉ์ด ์ ๋ค๊ณ ํ๋ค.
*์ฝ๋
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
int BFS(vector<vector<int>> board, int characterX, int characterY, int itemX, int itemY){
int direction[4][2] = {{0,-1},{0,1},{-1,0},{1,0}};
queue<pair<int,int>> q;
q.emplace(characterY, characterX);
while(!q.empty()){
int y = q.front().first;
int x = q.front().second;
q.pop();
if(y == itemY && x == itemX) {
break;
}
for(int i = 0; i < 4; i++){
int nextY = y + direction[i][1];
int nextX = x + direction[i][0];
//์ขํ ๋ฒ์์ฒดํฌ
if(nextX < 0 || nextX >= board.size() || nextY < 0 || nextY >= board[0].size()) continue;
//๋ฐฉ๋ฌธ์ํ์ผ๋ฉด
if(board[nextY][nextX] == 1){
q.emplace(nextY, nextX);
//1์ถ๊ฐํด์ ๋ฐฉ๋ฌธ์ฒดํฌ๊ฒธ ์ด๋๊ฑฐ๋ฆฌ ์ ์ฅ
board[nextY][nextX] = board[y][x] + 1;
}
}
}
return board[itemY][itemX] / 2;
}
int solution(vector<vector<int>> rectangle, int characterX, int characterY, int itemX, int itemY) {
// ์ต์ ๊ฑฐ๋ฆฌ
int answer = 0;
// ์บ๋ฆญํฐ์ ์์ดํ
์ขํ ๊ฐ 2๋ฐฐ๋ก ๋๋ฆฌ๊ธฐ
characterX *= 2, characterY *= 2, itemX *= 2, itemY *= 2;
// 101*101 ํฌ๊ธฐ์ ๋ณด๋ ์์ฑ
vector<vector<int>> board(101, vector<int>(101));
// ์ง์ฌ๊ฐํ์ ์์๊ณผ ๋ ์ขํ
int x1, y1, x2, y2;
// ์ง์ฌ๊ฐํ๋ค์ board ๋ฐฐ์ด์ ๋๊ธฐ
for(int i = 0; i < rectangle.size(); i++){
for(int j = 0; j < rectangle[i].size(); j++){
rectangle[i][j] = rectangle[i][j] * 2;
}
x1 = rectangle[i][0], y1 = rectangle[i][1];
x2 = rectangle[i][2], y2 = rectangle[i][3];
// ์ขํ๊ฐ์ด๋ผ ํ์ด๋ก ๋ฐ์ง๋ฉด x๊ฐ ์ด์ด๊ณ y๊ฐ ํ์ด๋ผ์ ๋ฐ๋๋ก ๋ง๋ค์ด์ค๋ค.
for(int y = y1; y <= y2; y++){
for(int x = x1; x <= x2; x++){
board[y][x] = 1;
}
}
}
// ์ง์ฌ๊ฐํ ๋ด๋ถ๋ฅผ 0์ผ๋ก ์ฑ์ฐ๊ธฐ
for(int i = 0; i < rectangle.size(); i++){
x1 = rectangle[i][0], y1 = rectangle[i][1];
x2 = rectangle[i][2], y2 = rectangle[i][3];
for(int y = y1 + 1; y < y2; y++){
for(int x = x1 + 1; x < x2; x++){
board[y][x] = 0;
}
}
}
// BFS๋ก ์บ๋ฆญํฐ ์ขํ๋ถํฐ ์์ดํ
์ขํ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ ํ์
answer = BFS(board, characterX, characterY, itemX, itemY);
return answer;
}
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][Goorm][ํ์] ์นด๋ ๊ตํํ๊ธฐ (0) | 2023.06.11 |
---|---|
[C++][Goorm][์ ๋ ฌ] ๋จ์ด์ฅ ๋ง๋ค๊ธฐ (1) | 2023.06.08 |
[C++][Programmers][์คํ/ํ] ๋ค๋ฆฌ๋ฅผ ์ง๋๋ ํธ๋ญ (0) | 2023.06.04 |
[C++][Programmers][์คํ/ํ] ์ฃผ์๊ฐ๊ฒฉ (0) | 2023.06.04 |
[C++][Programmers][์คํ/ํ] ํ๋ก์ธ์ค (0) | 2023.06.04 |