https://school.programmers.co.kr/learn/courses/30/lessons/86052
구현 아이디어 3분 구현 30분
통과는 했지만... 어디 내놓기 부끄러운 풀이다... 함수를 활용해서 풀이를 깔끔하게 고쳐볼 예정.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool map[501][501][4];
// 아래, 위, 왼, 오.
// dir = {0, 1, 2, 3};
vector<int> solution(vector<string> grid) {
vector<int> answer;
int N = grid.size();
int M = grid[0].size();
for(int r = 0; r < N; ++r)
{
for(int c = 0; c < M; ++c)
{
for(int i = 0; i < 4; ++i)
{
int dir = i;
int sum = 0;
while(true)
{
if(grid[r][c] == 'S')
{
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
if(dir == 0)
{
++r;
if(r == N) r = 0;
++sum;
}
else if(dir == 1)
{
--r;
if(r == -1) r = N - 1;
++sum;
}
else if(dir == 2)
{
--c;
if(c == -1) c = M - 1;
++sum;
}
else if(dir == 3)
{
++c;
if(c == M) c = 0;
++sum;
}
}
else if(grid[r][c] == 'L')
{
if(dir == 0)
{
dir = 3;
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
++c;
if(c == M) c = 0;
++sum;
}
else if(dir == 1)
{
dir = 2;
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
--c;
if(c == -1) c = M - 1;
++sum;
}
else if(dir == 2)
{
dir = 0;
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
++r;
if(r == N) r = 0;
++sum;
}
else if(dir == 3)
{
dir = 1;
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
--r;
if(r == -1) r = N - 1;
++sum;
}
}
else if(grid[r][c] == 'R')
{
if(dir == 0)
{
dir = 2;
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
--c;
if(c == -1) c = M - 1;
++sum;
}
else if(dir == 1)
{
dir = 3;
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
++c;
if(c == M) c = 0;
++sum;
}
else if(dir == 2)
{
dir = 1;
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
--r;
if(r == -1) r = N - 1;
++sum;
}
else if(dir == 3)
{
dir = 0;
if(map[r][c][dir] == true) break;
map[r][c][dir] = true;
++r;
if(r == N) r = 0;
++sum;
}
}
}
if(sum != 0) answer.push_back(sum);
}
}
}
sort(answer.begin(), answer.end());
return answer;
}
위의 풀이를 깔끔하게 고쳤다. 가독성이 더 좋다!
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool map[501][501][4];
// Func에서 연산을 간단하게 하려고 바꿈.
// 위, 오, 아래, 왼.
// dir: 0, 1, 2, 3;
int N, M;
int dr[4] = {-1, 0, 1, 0};
int dc[4] = {0, 1, 0, -1};
bool Func(char ch, int& dir, int& r, int& c)
{
// 1. 방향 정하기
if(ch == 'L')
{
if(dir == 0) dir = 3;
else dir -= 1;
}
else if(ch == 'R')
{
if(dir == 3) dir = 0;
else dir += 1;
}
// 2. 그 방향으로 이미 갔다면 false 리턴.
if(map[r][c][dir] == true) return false;
// 3. 아니라면 true 대입.
map[r][c][dir] = true;
// 3. r과 c 조정.
r += dr[dir];
c += dc[dir];
if(r < 0) r = N - 1;
else if(c < 0) c = M - 1;
else if(r >= N) r = 0;
else if(c >= M) c = 0;
return true;
}
vector<int> solution(vector<string> grid) {
vector<int> answer;
N = grid.size();
M = grid[0].size();
for(int r = 0; r < N; ++r)
for(int c = 0; c < M; ++c)
for(int i = 0; i < 4; ++i)
{
int dir = i;
int sum = 0;
while(true)
{
if(!Func(grid[r][c], dir, r, c)) break;
++sum;
}
if(sum != 0) answer.push_back(sum);
}
sort(answer.begin(), answer.end());
return answer;
}