260225 TIL - 챕터3 팀프로젝트 12일차

2026. 2. 25. 21:00언리얼 7기 본캠프

//거리두기 확인하기 문제. 지금까지 배웠던 이차원배열 관리와 탐색개념을 총망라해서 풀었음
//P를 찾을때마다 최대 2칸거리(X가 아닌 방향으로)로 탐색하는 방식으로 감염여부(?)를 파악함

#include <string>
#include <vector>

using namespace std;

vector<int> drow = {-1, 1, 0, 0};
vector<int> dcol = {0, 0, -1, 1};

void DFS(const vector<vector<string>>& places, vector<vector<bool>>& isvisited, int depth, int row, int col, bool& isnotok, int& roomnum)
{
    if (depth >= 2 || isnotok) return;

    for (int i = 0; i < 4; i++)
    {
        int newrow = row + drow[i];
        int newcol = col + dcol[i];
        if (newrow < 0 || newrow >= places[roomnum].size() || newcol < 0 || newcol >= places[roomnum][0].size()) continue;
        if (isvisited[newrow][newcol]) continue;
        if (places[roomnum][newrow][newcol] == 'X') continue;
        if (places[roomnum][newrow][newcol] == 'P')
        {
            isnotok = true;
            return;
        }
        isvisited[newrow][newcol] = true;
        DFS(places, isvisited, depth + 1, newrow, newcol, isnotok, roomnum);
    }
}

bool isroomok(const vector<vector<string>>& places, int& roomnum){
    for (int i = 0; i < places[roomnum].size(); i++)
    {
        for (int j = 0; j < places[roomnum][i].length(); j++)
        {
            if (places[roomnum][i][j] == 'X' || places[roomnum][i][j] == 'O') continue;
            bool isnotok = false;
            vector<vector<bool>> isvisited(places[roomnum].size(), vector<bool>(places[roomnum][0].length(), false));
            isvisited[i][j] = true;
            DFS(places, isvisited, 0, i, j, isnotok, roomnum);
            if (isnotok) return false;            
        }
    }
    return true;
}

vector<int> solution(vector<vector<string>> places) {
    vector<int> answer;
    
    for (int i = 0; i < places.size(); i++)
    {
        bool check = isroomok(places, i);
        if (check) answer.push_back(1);
        else answer.push_back(0);
    }
    
    return answer;
}

//숫자 카드 나누기 문제. 그냥 최대공약수 활용해서 푸는 그렇게까지 어렵지는 않은 문제였음
//벡터 내의 모든 숫자의 최대공약수를 구해본건 처음인 것 같은데, 최대공약수 수동으로 구하는건 몇번 해봤으니
//numeric 헤더를 써봤는데 이렇게 편할수가 없음... 물론 그냥 구현하는법도 기억은 해놔야겠지만(유클리드 호제법)
//이것도 충분히 좋은 방법중 하나인듯

#include <string>
#include <vector>
#include <numeric>

using namespace std;

int findvectorGCD(vector<int>& vec)
{
    if (vec.size() == 1) return vec[0];
    int result = vec[0];
    for(int i = 1; i < vec.size(); i++)
    {
        result = gcd(result, vec[i]);
        if (result == 1) return 1;
    }
    return result;
}

int solution(vector<int> arrayA, vector<int> arrayB) {
    int answer = 0;
    int GCDA = findvectorGCD(arrayA);
    int GCDB = findvectorGCD(arrayB);
    bool isagood = true, isbgood = true;
    for(const int& i : arrayA)
    {
        if (i % GCDB == 0)
        {
            isagood = false;
            break;
        }
    }
    for(const int& i : arrayB)
    {
        if (i % GCDA == 0)
        {
            isbgood = false;
            break;
        }
    }
    
    if (!isagood && !isbgood) return 0;
    if (isagood && !isbgood) return GCDB;
    if (isbgood && !isagood) return GCDA;
    return max(GCDA, GCDB);
}

 

오늘은 테스트빌드를 완성해서 튜터님에게 보여드리고 상당히 좋은 평가를 받았음. 그래서 힘내서 완성까지 달려보기로 했고. 시간이 촉박하기 때문에 적어도 목요일까지 로직을 최대한 마쳐보고, 이후 더 필요한 로직이 있으면 내가 전담해서 관리하고 다른 팀원분들은 폴리싱 작업에 전념해서 화요일까지 완성하는걸로 가닥을 잡았음

끝이 보이니 조금만 더 화이팅....흑흑

 

힘들ㄹ다...