728x90
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐จ๐ปํ์ด ๊ณผ์
์ด๋ ค์ด ๊ตฌํ ๋ฌธ์ ๊ฐ ์๋๋ฐ, ์ ์ด ์๋ ์ ๋ถ(line) ์ฒ๋ฆฌ๊ฐ ๊น๋ค๋ก์ด ๋ฌธ์ ์๋ค์. ์ ๋ถ์ ๋ ๊ฐ์ ์ (Point)์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋, map์ ํตํด <์์์ , ๋ ์ ๋ค>์ ๊ด๋ฆฌํ์์ต๋๋ค. ๋ ์ ๋ค์ด๋ผ๊ณ ํํํด๋จ๋๋ฐ, ํ๋ ์ด์ด๊ฐ ํ ๋ฒ์ ์์ง์ผ ์ ์๋ ์ต๋ ์นธ์๋ 1์นธ์ด๋ฏ๋ก, ์ ํ๋๋น ๊ฐ์ง ์ ์๋ ์ ๋ถ์ ์ข ๋ฅ๋ 4๊ฐ์ง(์, ํ, ์ข, ์ฐ)์ ๋๋ค.
์ ๊ฐ ๊ตฌํํ ๋ก์ง์ ์๋๋ฆฌ์ค๋๋ก ํ๋ฒ ๋ณด๋๋ก ํ์ฃ . "UUDL"์ ํ ๋ฒ ์์๋ก ๋ณด๊ฒ ์ต๋๋ค.
1. [U] ์ถ๋ฐ์ง(0, 0)์์ ํ ์นธ ์๋ก ์ฌ๋ผ๊ฐ๊ณ , ํด๋น ์ ๋ถ์ map์ ๋ฑ๋กํฉ๋๋ค.
- ๋์ฐฉ์ง(0, 1)์์ ์ถ๋ฐ์ง(0, 0)๊น์ง์ ์ ๋ถ๋ ๊ฐ์ ์ ๋ถ์ด๋ฏ๋ก, ์ถ๋ฐ์ง์ ๋์ฐฉ์ง ์์๋ฅผ ๋ณ๊ฒฝํ ๊ฒ๋ map์ ๋ฑ๋กํด์ค๋๋ค. ์ด ๋ถ๋ถ์ ๋ชจ๋ ์ด๋์์ ๋๊ฐ์ด ์ ์ฉ๋ฉ๋๋ค.
- ๋ฑ๋ก๋ ์ ๋ถ๋ค ์ค์ ํ์ฌ ์ ๋ถ์ด ์๋ค๋ฉด answer + 1์ ํด์ค๋๋ค.
2. [U] (0, 1) \( \rightarrow \) (0, 2)๋ก ์ด๋ํ์ฌ ๋๊ฐ์ด map์ ๋ฑ๋กํฉ๋๋ค.
3. [D] (0, 2) \( \rightarrow \) (0, 1)๋ก ์ด๋ํ์ง๋ง, ์ด ์ ๋ถ์ ๋ ์ ์ ๋ฑ๋ก๋ ์ ๋ถ์ด๋ฏ๋ก ์นด์ดํธ X
4. [L] (0, 1) \( \rightarrow \) (-1, 1)๋ก ์ด๋ํด์ค๋๋ค.
์ด๋ก์จ answer = 3์ผ๋ก ๋ต์ ๋์ถํ ์ ์์ต๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <string>
#include <vector>
#include <map>
using namespace std;
const int MAX_LENGTH = 11;
struct Point {
Point() { }
Point(int row, int col) : _row(row), _col(col) { }
bool operator<(const Point& other) const {
if (_row == other._row)
return _col < other._col;
return _row < other._row;
}
bool operator==(const Point& other) const {
return _row == other._row and _col == other._col;
}
int _row;
int _col;
};
map<char, Point> directions { {'U', {-1, 0 }}, { 'D', {1, 0} }, { 'R', {0, 1} }, { 'L', {0, -1} } };
class Record {
public:
void Insert(const Point& otherStart, const Point& otherEnd) {
auto iter = _lines.find(otherStart);
/* ๋ ์ ๋ถ์ ์์์ ์ด ๊ฐ๋ค๋ฉด, ๋ ์ ์ ๋น๊ตํด๋ณธ๋ค. */
if (iter != _lines.end()) {
for (const auto myEndPoint : iter->second) {
if (myEndPoint == otherEnd)
return;
}
}
// ์ A, B๊ฐ ์๋ค๋ฉด A-B, B-A๋ ๊ฐ์ ์ ๋ถ์ด๋ฏ๋ก ๋ ๋ค ์ถ๊ฐ
_lines[otherStart].push_back(otherEnd);
_lines[otherEnd].push_back(otherStart);
_firstStepCount++;
}
int GetAnswer() { return _firstStepCount; }
private:
map<Point, vector<Point>> _lines; // <์์์ , ๋ ์ ๋ค>
int _firstStepCount = 0;
};
int solution(string dirs) {
int firstStepCount = 0;
int halfLine = MAX_LENGTH / 2;
Point player(halfLine, halfLine);
Record record;
for (const auto instruction : dirs) {
int nextRow = player._row + directions[instruction]._row;
int nextCol = player._col + directions[instruction]._col;
if (nextRow < 0 or nextRow >= MAX_LENGTH or nextCol < 0 or nextCol >= MAX_LENGTH)
continue;
Point start = player;
Point end = player = Point(nextRow, nextCol);
record.Insert(start, end);
}
return record.GetAnswer();
}
728x90
๋ฐ์ํ
'๐คAlgorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Programmers] Lv2. [1์ฐจ] ํ๋ ์ฆ4๋ธ๋ก | C++ (0) | 2023.06.24 |
---|---|
[Programmers] Lv2. [3์ฐจ] ํ์ผ๋ช ์ ๋ ฌ | C++ (0) | 2023.06.24 |
[Programmers] Lv2. ๊ฒ์ ๋งต ์ต๋จ๊ฑฐ๋ฆฌ | C++ (0) | 2023.06.22 |
[Programmers] Lv2. ์ฃผ์๊ฐ๊ฒฉ | C++ (0) | 2023.06.22 |
[Programmers] Lv2. ๋ ๋ฐ๋จน๊ธฐ | C++ (0) | 2023.06.22 |