프로그래머스(Programmers)
프로그래머스 교점에 별 만들기 C++
cosmohoo
2022. 7. 13. 00:18
반응형
이때, 모든 교점의 좌표는 (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4), (1.5, 1.0), (2.1, -0.19), (0, -1.5), (-2.1, -0.19), (-1.5, 1.0)입니다. 이 중 정수로만 표현되는 좌표는 (4, 1), (4, -4), (-4, -4), (-4, 1), (0, 4)입니다.
만약 정수로 표현되는 교점에 별을 그리면 다음과 같습니다.
위의 그림을 문자열로 나타낼 때, 별이 그려진 부분은 *, 빈 공간(격자선이 교차하는 지점)은 .으로 표현하면 다음과 같습니다.
"..........."
".....*....."
"..........."
"..........."
".*.......*."
"..........."
"..........."
"..........."
"..........."
".*.......*."
"..........."
이때 격자판은 무한히 넓으니 모든 별을 포함하는 최소한의 크기만 나타내면 됩니다.
따라서 정답은
"....*...."
"........."
"........."
"*.......*"
"........."
"........."
"........."
"........."
"*.......*"
입니다.
직선 A, B, C에 대한 정보가 담긴 배열 line이 매개변수로 주어집니다. 이때 모든 별을 포함하는 최소 사각형을 return 하도록 solution 함수를 완성해주세요.
=> 두 직선의 교점의 공식을 알아야 합니다.
=> ax + by + C =0 , lx + my + N =0
=> 두 직선의 교점의 공식입니다.
- bn - cm / am - bl
- cl - an / am -bl
=> 분모가 0일 경우, 두 직선은 평행이거나 일치합니다. 하지만 문제의 조건에서 일치하는 경우는 주어지지 않는다고 하므로 일치하는 경우는 염두에 두지 않아도 됩니다.
=> 풀이는 아래에 그림으로 대체하겠습니다.
#include <string>
#include <vector>
#include <climits>
#include <iostream>
#include <utility>
#include <algorithm>
using namespace std;
//교점 저장할 pair형 vector
vector<pair<int, int>> crossP;
vector<string> solution(vector<vector<int>> line) {
vector<string> answer;
long long maxX = LLONG_MIN; long long maxY = LLONG_MIN;
long long minX = LLONG_MAX; long long minY = LLONG_MAX;
for(int i=0; i<line.size(); i++)
{
//직선1
long long A = line[i][0];
long long B = line[i][1];
long long C = line[i][2];
for(int j=i+1; j<line.size(); j++)
{
//직선2
long long L = line[j][0];
long long M = line[j][1];
long long N = line[j][2];
//분모
long long deno = (A*M) - (B*L);
//분자_x좌표
long long moleX = (B*N)-(C*M);
//분자_y좌표
long long moleY = (C*L)-(A*N);
//분모가 '0'인 경우, 교점이 없음
if(deno == 0) continue;
//교점이 정수가 아닌 경우, 건너뜀
if(moleX % deno || moleY %deno)continue;
int X = moleX / deno;
int Y = moleY / deno;
crossP.push_back(make_pair(X,Y));
maxX = max(maxX, (long long)X); minX = min(minX, (long long)X);
maxY = max(maxY, (long long)Y); minY = min(minY, (long long)Y);
}
long long row = maxX - minX +1; //x축
long long col = maxY - minY +1; //y축
string tmp(row, '.');
answer.assign(col, tmp);
for(int i=0;i<crossP.size();i++)
{
long long y = crossP[i].second;
long long x =crossP[i].first;
answer[maxY-y][x-minX]='*';
}
}
return answer;
}
반응형