어흥
[프로그래머스] 교점에 별 만들기 (C++) 본문
728x90
반응형
문제 링크: https://programmers.co.kr/learn/courses/30/lessons/87377#qna
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
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 피로도 (C++) (0) | 2021.11.04 |
---|---|
[프로그래머스] 아이템 줍기 (C++) (0) | 2021.10.22 |
[프로그래머스] 전력망을 둘로 나누기 (C++) (0) | 2021.10.06 |
[프로그래머스] 삼각 달팽이 (C++) (0) | 2021.09.29 |
[프로그래머스] 오픈채팅방 (C++) (0) | 2021.09.28 |
Comments