오늘의 알고리즘
[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 넘어간다.