C++:: 프로그래머스 < 교점에 별 만들기 >

jahlee·2023년 5월 26일
0

프로그래머스_Lv.2

목록 보기
51/106
post-thumbnail

좌표를 구하는 방법은 문제 아래에 참고 공식을 사용하면 된다. 그래프의 좌표와 vector에 넣는 좌표가 다른것을 주의해야하며, 좌표이동을 해줄때 주의해주어야하는 문제이다. 또한 공식을 사용한 계산과정에서 long long 범위가 되는 연산이 존재한다. 이때문에 시간이 좀 걸린 문제이다.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

vector<string> solution(vector<vector<int>> line)
{// 주어진 공식으로 교차점을 구한다.
    vector<pair<int,int>> cords;
    for(int i=0;i<line.size();i++)
    {
        for(int j=i+1;j<line.size();j++)
        {
            int adbc = line[i][0]*line[j][1] - line[i][1]*line[j][0];
            if (adbc)
            {// 평행인 직선이 아닐때, 즉 교차점이 존재한다면
                long long x = (1LL*line[i][1]*line[j][2] - 1LL*line[i][2]*line[j][1]);
                long long y = (1LL*line[i][2]*line[j][0] - 1LL*line[i][0]*line[j][2]);
                if (x%adbc==0 && y%adbc==0) cords.push_back({x/adbc,y/adbc});// 정수인 좌표만 저장
            }
        }
    }
    sort(cords.begin(), cords.end());//정렬후
    cords.erase(unique(cords.begin(), cords.end()), cords.end());//중복 삭제
    int x_min=INT32_MAX, x_max= INT32_MIN, y_min=INT32_MAX, y_max=INT32_MIN;
    for(auto cord : cords)
    {//좌표에서 테두리를 구하기 위한 과정
        x_min = min(x_min, cord.first);
        x_max = max(x_max, cord.first);
        y_min = min(y_min, cord.second);
        y_max = max(y_max, cord.second);
    }
    int n = y_max - y_min, m = x_max - x_min;// answer[n][m]이다.
    vector<string> answer;
    for(int i=0;i<=n;i++)
    {//테투리의 크기만큼 .으로 초기화한 answer 배열을 만들어준다.
        string tmp(m+1,'.');
        answer.push_back(tmp);
    }
    for(auto cord : cords) answer[-cord.second+y_max][cord.first-x_min] = '*';
    // 좌표이동해서 찍어준다. 이때 현실 좌표와는 x축으로 반전을 시켜주어야 한다.
    return answer;
}

0개의 댓글