빛의 경로 사이클(33분)

myeongrangcoding·2023년 11월 21일

프로그래머스

목록 보기
35/65

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;
}
profile
명랑코딩!

0개의 댓글