이 문제는 어떤 개념이나 알고리즘이 필요한 문제는 아니다. 다만 문제에서 주어진 범위의 수를 활용하면 int 범위를 넘어갈 수 있기 때문에 long long int를 사용하는 것이 안전하다.
Ax + By + C = 0 으로 표현되는 n개의 직선에 대하여, 이 직선들의 교점 중 정수 좌표에 별()을 그린다.
이 별을 문자열로 나타낼 때 격자판의 크기는 별을 포함하는 최소한의 크기만 나타낸다.
(별은 로 나타내고 나머지는 .으로 나타낸다.)
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
vector<string> solution(vector<vector<int>> line) {
//map의 크기를 정하는 최소와 최대값
long long minX = LLONG_MAX, minY = LLONG_MAX;
long long maxX = LLONG_MIN, maxY = LLONG_MIN;
//정수 정점을 저장한다.
vector<pair<long long, long long>> coords;
int lineSize = line.size();
for (int i = 0; i < lineSize; i++) {
for (int j = i + 1; j < lineSize; j++) {
//자신을 제외한 직선과 정점 검사
long long A = line[i][0], B = line[i][1], E = line[i][2];
long long C = line[j][0], D = line[j][1], F = line[j][2];
long long xNumerator = B * F * 1LL - E * D * 1LL;
long long yNumerator = E * C * 1LL - A * F * 1LL;
long long mod = A * D * 1LL - B * C * 1LL;
//1번 조건 검사
if (mod == 0) { continue; }
//2번 조건 검사
if (xNumerator % mod || yNumerator % mod) { continue; }
long long x = xNumerator / mod;
long long y = yNumerator / mod;
minX = min(minX, x);
minY = min(minY, y);
maxX = max(maxX, x);
maxY = max(maxY, y);
//3번 조건 실행
coords.push_back({ x, y });
}
}
//answer 초기화
string row = string(maxX - minX + 1, '.');
vector<string> answer(maxY - minY + 1, row);
//필요 부분만 *로 초기화+coord에 저장된 변수 모두 방문
for (pair<long long, long long> coord : coords) {
answer[maxY - coord.second][coord.first - minX] = '*';
}
return answer;
}