오늘의 알고리즘

[C++]위클리 챌린지 교점에 별 만들기(프로그래머스 2레벨)

하늘하늘 . 2022. 4. 18. 16:06
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<string> solution(vector<vector<int>> line) 
{
    vector<int> vecX = {};
    vector<int> vecY = {};
 
    for (int i = 0; i < line.size(); ++i)
    {
        for (int j = i + 1; j < line.size(); ++j)
        {
            long long A = line[i][0];
            long long B = line[i][1];
            long long E = line[i][2];
            long long C = line[j][0];
            long long D = line[j][1];
            long long F = line[j][2];
 
            // 교점이 있다면
            if ((A*D - B*C) != 0)
            {
                // 정수만
                if ((B * F - E * D) % (A * D - B * C) == 0 &&
                    (E * C - A * F) % (A * D - B * C) == 0)
                {
                    vecX.emplace_back((B * F - E * D) / (A * D - B * C));
                    vecY.emplace_back((E * C - A * F) / (A * D - B * C));
                }
            }
        }
    }
 
    string dotString = {};
 
    int MaxX = *max_element(vecX.begin(), vecX.end());
    int MinX = *min_element(vecX.begin(), vecX.end());
    int MaxY = *max_element(vecY.begin(), vecY.end());
    int MinY = *min_element(vecY.begin(), vecY.end());
 
    // 최소값만큼 빼주기 (제일 최소값을 0으로 만들기 위해서)
    for (int i = 0; i < vecX.size(); ++i)
    {
        vecX[i] -= MinX;
        vecY[i] -= MinY;
    }
 
    // X축 크기만큼 .만들기
    for (int i = 0; i < MaxX - MinX + 1; ++i)
    {
        dotString += ".";
    }
 
    // Y축 크기만큼 answer 생성 + dot넣어주기
    vector<string> answer((size_t)MaxY - MinY + 1, dotString);
 
    int iSize = answer.size() - 1;
    for (int i = 0; i < vecX.size(); ++i)
    {
        // 0부터 시작이라 Y축이 뒤집혀있으므로 다시 뒤집어 준다.
        answer[-(vecY[i] - iSize)][vecX[i]] = '*';
    }
 
    return answer;
}
 

쉬운데 귀찮은 문제...

1. 평행인지 확인하기

2. 정수인지 확인하기

3. 10만 * 10만 = 100억 -> int 넘어간다.