๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ง๐ป๐ปํ์ด ๊ณผ์
๋ฌธ์ ๋ก์ง ์์ฒด๋ ์ด๋ ต์ง ์์๋ฐ, ๊ตฌํํ ๊ฒ ๋ง์์ ์๋นํ ๊ท์ฐฎ์๋ ๋ฌธ์ ์ ๋๋ค. ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ฅ์ ์ฝ์ ์ ์์ต๋๋ค.
๋ฑ์ ๋จธ๋ฆฌ๊ฐ ๋จผ์ ํ ์นธ ์ด๋ํฉ๋๋ค.
๊ทธ ์์น์ ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๊ผฌ๋ฆฌ๋ ํ ์นธ ์ด๋ํ๊ณ , ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด ๊ผฌ๋ฆฌ๋ ์ด๋ํ์ง ์์ต๋๋ค.
์ ๋ฌธ์ฅ์ ๊ตฌํํ๋ ค๋ฉด, ๋ฑ์ ๊ผฌ๋ฆฌ๊ฐ ์ด๋ํ ๋ฐฉํฅ์ ๋ํ ์ ๋ณด๊ฐ ํ์ํฉ๋๋ค. ๋ฑ์ ๊ผฌ๋ฆฌ๊ฐ ์ด๋ํด์ผ ํ ๋ฐฉํฅ์ ์ด์ ๊น์ง ๋ฑ์ ๋จธ๋ฆฌ๊ฐ ์ด๋ํ๋ ๋ฐฉํฅ๋ค์ด๋ฏ๋ก, ๋ฑ์ ๋จธ๋ฆฌ๊ฐ ์ด๋ํ๋ ๊ฒฝ๋ก๋ค์ด ์ฐจ๋ก๋๋ก ํ์ํฉ๋๋ค. ์ฆ, Queue๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ํ์ง๋ง, ๋ ํ๋ ์ค์ํ๊ฒ ๋ด์ผ ํ ์กฐ๊ฑด์ด ์์ต๋๋ค.
๊ฒ์ ์์ ์๊ฐ์ผ๋ก๋ถํฐ X์ด๊ฐ ์ง๋ ํ, ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฑ์ด 90๋ ๋ฐฉํฅ์ ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ด๊ธฐ ๊ธฐ๋ณธ ์ด๋ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ, ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ฒ์ ์ด๊ธฐ ์ด๋ ๋ฐฉํฅ์ ์ค๋ฅธ์ชฝ์ ๋๋ค.
๋ฐฉํฅ ์ ๋ณด๋ง์ ๊ด๋ฆฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, (ํ, ์ด)๋ก ํ์ํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ : (-1, 0)
์๋ : (1, 0)
์ผ์ชฝ : (0, -1)
์ค๋ฅธ์ชฝ : (0, 1)
๊ธฐ๋ณธ ์์์ด ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ด๋ฏ๋ก, ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์์ 90๋๋ก ํ ์ ์๋ ๋ฐฉํฅ์ ์์ชฝ๊ณผ ์๋์ชฝ์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ๋ฐฉํฅ ์ ๋ณด ๋ฐฐ์ด์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
// [0]์, [1]์ฐ, [2]ํ, [3]์ข
vector<Direction> _directions { {-1, 0}, { 0, 1 }, { 1, 0 }, { 0, -1 } };
int directionIdx = 1; // ์ด๊ธฐ ๊ธฐ๋ณธ ์ด๋ ๋ฐฉํฅ์ ์ค๋ฅธ์ชฝ์ด๋ฏ๋ก 1๋ฒ ์ธ๋ฑ์ค
์ด ์ํ์์ ๋ง์ฝ ์ผ์ชฝ์ผ๋ก ํ์ ํด์ผ ํ๋ค๋ฉด ํ์ฌ ์ธ๋ฑ์ค์ -1์, ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ํด์ผ ํ๋ค๋ฉด +1์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๋ฌผ๋ก ํ์ฌ ์ธ๋ฑ์ค๊ฐ 0์ธ๋ฐ ์ผ์ชฝ์ผ๋ก ๊ฐ์ผํ๋ ๊ฒฝ์ฐ์๋ ๋ฐฐ์ด์ ๋งจ ๋ง์ง๋ง ์์๋ก ๋ฐ๊ฟ์ฃผ๊ณ , ํ์ฌ ์ธ๋ฑ์ค๊ฐ ๋ฐฐ์ด ํฌ๊ธฐ๋ฅผ ๋์ง ์๊ธฐ ์ํด % ์ฒ๋ฆฌํด์ฃผ๋ ์์ธ ์ฒ๋ฆฌ๋ ๋ณ๋๋ก ํด์ค์ผ ๊ฒ ์ง์.
๐ ๏ธ์๊ณ ๋ฆฌ์ฆ
์ฌ๊ธฐ๊น์ง ํ๋ค๋ฉด, ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ํต์ฌ ์ฝ์ด๋ ์์ฑํ ์ ์ ๋๋ค. ์ด์ ๋ค์๊ณผ ๊ฐ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ์๋ฎฌ๋ ์ด์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๋งต์์ ์นธ์ ๊ตฌ๋ณํด์ฃผ๊ธฐ ์ํด, ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ์์ต๋๋ค.
const int EMPTY = 0;
const int SNAKE = 1;
const int APPLE = 2;
Position _head = Position(0, 0); // ๋จธ๋ฆฌ ์์น
Position _tail = Position(0, 0); // ๊ผฌ๋ฆฌ ์์น
- ํ์ฌ ๊ฒ์ ์๊ฐ์์ ๋ฐฉํฅ์ ๋ฐ๊ฟ์ผ ํ๋์ง ๊ฒ์ฌํฉ๋๋ค.
- ๋ฐ๊ฟ์ผ ํ๋ค๋ฉด, ์ธ๋ฑ์ค๋ฅผ ๋ณ๊ฒฝํด์ค๋๋ค.
- ๊ฒ์ ์งํ ์๊ฐ์ 1์ด ์ฆ๊ฐ์ํต๋๋ค.
- ๋ฑ์ ๋จธ๋ฆฌ๋ฅผ ์ด๋ ๋ฐฉํฅ์ผ๋ก ํ ์นธ ์ด๋์ํต๋๋ค.
- ์ด ๋, ์ด ์ด๋ ๋ฐฉํฅ์ ๋ณ๋์ Queue์ ์ ์ฅํ์ฌ, ๋์ค์ ๊ผฌ๋ฆฌ๊ฐ ์์ง์ผ ๋ ํ๋์ฉ ๋ฝ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.
- ๋ง์ฝ ๋ฑ์ ๋จธ๋ฆฌ๊ฐ ์ด๋ํ ์์น๊ฐ ์๊ธฐ ์์ ์ ๋ชธ์ด๊ฑฐ๋ ๋ฒฝ์ด๋ฉด ์ข ๋ฃํฉ๋๋ค.
- ์๋๋ผ๋ฉด, ๋จธ๋ฆฌ๊ฐ ์ด๋ํ ์์น์ ์ฌ๊ณผ๊ฐ ์๋์ง ํ์ธํฉ๋๋ค.
- ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ํ์ฌ ๊ผฌ๋ฆฌ ์์น๋ EMPTY๋ก ์ฑ์ฐ๊ณ , Queue์์ ํ๋ ๋ฝ์ ํด๋น ๋ฐฉํฅ์ผ๋ก ๊ผฌ๋ฆฌ๋ฅผ ํ ์นธ ์ด๋ํฉ๋๋ค.
- ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๋ชธ์ ๊ธธ์ด๊ฐ ๋์ด๋๋ฏ๋ก ์๋ฌด๋ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋ฉ๋๋ค.
- ๋ฑ์ด ์ด๋ํ ๋จธ๋ฆฌ ์์น ์นธ์ SNAKE๋ก ์ ์ฅํฉ๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
using Direction = pair<int, int>;
class Board
{
public:
Board();
void StartGame();
int ShowPlayTime() { return _playTime; }
private:
void CheckTurning();
void CheckApple();
private:
struct TurningData
{
TurningData() { }
TurningData(int time, char directionMark) : _time(time), _directionMark(directionMark) { }
int _time;
char _directionMark;
};
struct Position
{
Position() { }
Position(int row, int col) : _row(row), _col(col) { }
Position operator+(const Direction& other) { return Position(_row + other.first, _col + other.second); }
int _row;
int _col;
};
private:
vector<vector<int>> _board;
queue<TurningData> _turningData;
queue<Direction> _tailMoveDirections;
// (-1, 0):์, (0, 1):์ฐ, (1, 0):ํ, (0, -1):์ข
vector<Direction> _directions { {-1, 0}, { 0, 1 }, { 1, 0 }, { 0, -1 } };
private:
int _directionIdx = 1;
int _playTime = 0;
int _N;
Position _head = Position(0, 0); // ๋จธ๋ฆฌ ์์น
Position _tail = Position(0, 0); // ๊ผฌ๋ฆฌ ์์น
private:
const int EMPTY = 0;
const int SNAKE = 1;
const int APPLE = 2;
};
Board::Board()
{
int N, appleCount, turningInformations;
cin >> N >> appleCount;
_N = N;
// 1. N x N ๋ณด๋ํ ๋ง๋ค๊ธฐ
_board.resize(N);
for (int i = 0; i < N; i++)
_board[i].resize(N);
_board[0][0] = SNAKE; // ๋ฑ ์ฒ์ ์์น ๋ฑ๋ก
// 2. ๋งต์ ์ฌ๊ณผ ์ฑ์ฐ๊ธฐ
for (int i = 0; i < appleCount; i++)
{
int row, col;
cin >> row >> col;
_board[row - 1][col - 1] = APPLE;
}
// 3. ๋ฐฉํฅ ์ ํ ํฌ์ธํธ ์ ์ฅํ๊ธฐ
cin >> turningInformations;
for (int i = 0; i < turningInformations; i++)
{
int time;
char mark;
cin >> time >> mark;
_turningData.emplace(TurningData(time, mark));
}
}
void Board::CheckTurning()
{
if (!_turningData.empty())
{
TurningData data = _turningData.front();
if (data._time == _playTime)
{
_turningData.pop();
int addIdx = (data._directionMark == 'L') ? -1 : 1;
if (_directionIdx == 0 and addIdx == -1)
{
_directionIdx = _directions.size() - 1;
return;
}
_directionIdx = (_directionIdx + addIdx) % _directions.size();
}
}
}
void Board::CheckApple()
{
if (_tailMoveDirections.empty())
return;
// ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด, ๊ผฌ๋ฆฌ ์ด๋
if (_board[_head._row][_head._col] != APPLE)
{
Direction next = _tailMoveDirections.front();
_tailMoveDirections.pop();
_board[_tail._row][_tail._col] = EMPTY;
_tail = _tail + next;
}
}
void Board::StartGame()
{
while (true)
{
// 1. ๋ฐฉํฅ์ ๋ฐ๊ฟ์ผ ํ๋์ง ํ์ธ
CheckTurning();
_playTime++;
_head = _head + _directions[_directionIdx];
_tailMoveDirections.emplace(_directions[_directionIdx]);
// 2. ๋ฒฝ์ ๋ถ๋ชํ๋ค๋ฉด ๊ฒ์ ์ข
๋ฃ
if (_head._row < 0 or _head._row >= _N or _head._col < 0 or _head._col >= _N)
break;
// 3. ๋จธ๋ฆฌ๊ฐ ์๊ธฐ ๋ชธ๊ณผ ๋ถ๋ชํ๋ฉด ๊ฒ์ ์ข
๋ฃ
if (_board[_head._row][_head._col] == SNAKE)
break;
// 4. ์ฌ๊ณผ ์ฌ๋ถ ํ์ธ
CheckApple();
_board[_head._row][_head._col] = SNAKE;
}
}
int main()
{
ios::sync_with_stdio(false);
cout.tie(NULL); cin.tie(NULL);
Board gameBoard;
gameBoard.StartGame();
cout << gameBoard.ShowPlayTime();
return 0;
}
'๐คAlgorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 11659๋ฒ | ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 4 (C++) (0) | 2023.08.27 |
---|---|
[BOJ] 10844๋ฒ | ์ฌ์ด ๊ณ๋จ ์ (C++) (0) | 2023.08.26 |
[BOJ] 16198๋ฒ | ์๋์ง ๋ชจ์ผ๊ธฐ (C++) (0) | 2023.08.25 |
[BOJ] 1759๋ฒ | ์ํธ ๋ง๋ค๊ธฐ (C++) (0) | 2023.08.25 |
[BOJ] 15686๋ฒ | ์นํจ ๋ฐฐ๋ฌ (C++) (0) | 2023.08.24 |