어흥

[프로그래머스] 교점에 별 만들기 (C++) 본문

알고리즘/프로그래머스

[프로그래머스] 교점에 별 만들기 (C++)

라이언납시오 2021. 10. 13. 18:43
728x90
반응형

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/87377#qna

 

코딩테스트 연습 - 10주차

[[2, -1, 4], [-2, -1, 4], [0, -1, 1], [5, -8, -12], [5, 8, 12]] ["....*....", ".........", ".........", "*.......*", ".........", ".........", ".........", ".........", "*.......*"] [[0, 1, -1], [1, 0, -1], [1, 0, 1]] ["*.*"] [[1, -1, 0], [2, -1, 0], [4, -

programmers.co.kr

1. 주의할 점

- 벡터에 값 채우기

- 범위 설정

 

2. 구현

- 역행렬을 통해 X와 Y의 값을 도출한다. 이때, D==0 or X나 Y의 값이 정수가 아닌 실수라면 Continue 수행

- 계산할 때, 10만*10만은 int형 범위를 벗어나니 주의한다

- 도출된 X와 Y값을 저장하고, miniX,miniY,maxX,maxY를 갱신한다. 이때, 4 변수는 모두 RANGE 값을 적절히 이용하여 초기화한다(10만이 아닌 10만*10만이 나올 수 있으므로 주의)

- Ans 벡터를 전부 .으로 초기화하고 별들의 위치를 나타낸다

#define RANGE 10000000001
#include <string>
#include <vector>
#include <iostream>
using namespace std;
struct info{
    long long y,x;
};
vector<info> v;
long long len,maxX,minX,maxY,minY;
void init(){
    maxX = -RANGE;
    maxY = -RANGE;
    minX = RANGE;
    minY = RANGE;
}

vector<string> solution(vector<vector<int>> line) {
    vector<string> answer;
    len = line.size();
    init();
    for(int i=0;i<len-1;i++)
        for(int j=i+1;j<len;j++){
            long long adbc = (long long)line[i][0]*line[j][1]-(long long)line[i][1]*line[j][0];
            if(adbc==0)  continue;      //평행 또는 일치. 단, 무수히 많은 교점->일치가 주어지지 않는다고 했으니 평행만 있다 
            long long bfed = (long long)line[i][1]*line[j][2]-(long long)line[i][2]*line[j][1];
            long long ecaf = (long long)line[i][2]*line[j][0]-(long long)line[i][0]*line[j][2];
            if((bfed%adbc!=0) || (ecaf%adbc!=0)) continue;    //정수가 아닌 경우
            bfed/=adbc;     //x
            ecaf/=adbc;     //y
            v.push_back({ecaf, bfed});
            maxX = max(maxX,(long long)bfed);
            maxY = max(maxY,(long long)ecaf);
            minX = min(minX,(long long)bfed);
            minY = min(minY,(long long)ecaf);
        }
    long long row = maxY-minY+1;
    long long col = maxX-minX+1;
    string temp(col, '.');
    answer.assign(row, temp);
    for(int i=0;i<v.size();i++){
        long long y = v[i].y;
        long long x = v[i].x;
        answer[maxY-y][x-minX]='*';
    }
    return answer;
}
728x90
반응형
Comments