본문 바로가기
알고리즘/프로그래머스

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

by 오오오니 2023. 9. 26.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/87377

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

1. 교점을 구해서 저장한다..

2. 교점의 범위만큼 정답을 초기화 해준다.

3. 수학에서 쓰는 x,y좌표를 컴퓨터에서 쓰는 배열에 맞게 좌표를 조정해주고 교점에 '*'을 넣어준다.

* 정답은 1000*1000크기 이내로 표현된다고 했지만 10000000000 ~ 10000001000 사이에 좌표가 존재할 수도 있기 때문에 교점을 배열의 인덱스를 이용하면 안된다. ex) a[x][y]='*';

* 좌표계에서 x,y좌표를 answer벡터에 옮겼을때 똑같아 보이려면 다음과 같이 해야한다.

1. 원점과 제일 좌측하단에 있는 점을 일치 시킨다.  -  cross[i][1]-min_y, cross[i][0]-min_x  (cross[i][1]에는 y 좌표가 들어있다.) 

2. 벡터에 옮길때 y 좌표를 i에 x 좌표를 j에 할당하면 원래 좌표가 x축 대칭이 된 모습이 된다.
answer[cross[i][1]-min_y][cross[i][0]-min_x]

2-1. 좌표중에 제일 큰 y 값과 제일 작은 y값의 차이를 구한다.  yy라고 칭한다.
long long yy=max_y-min_y;

3. i에 yy-i 를 넣는다.  answer 벡터를 출력하면 y값이 증가할수록 아래로 찍히기 때문이다.
answer[yy-(cross[i][1]-min_y)][cross[i][0]-min_x]

* int가 아니라 long long을 사용해줘야한다.

* 최솟값, 최댓값 초기화를 int보다 훨씬 크게 설정해줘야한다.

 

 

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


vector<vector<long long>>cross;

long long a,b,e,c,d,f;
long long x,y;
long long max_x=-90000000000,min_x=90000000000,max_y=-90000000000,min_y=90000000000;
vector<string> solution(vector<vector<int>> line) {
    vector<string> answer;
    //교점 구하기 
    int line_size= line.size();

    for(int i=0;i<line_size;i++){
        for(int j=i+1;j<line_size;j++){
            //두 직선 사이의 교점 구하면 vector에 저장
            a=line[i][0];
            b=line[i][1];
            e=line[i][2];

            c=line[j][0];
            d=line[j][1];
            f=line[j][2];

            //평행하거나 일치하면 continue
            if((a*d-b*c)==0)
                continue;
            x=(b*f-e*d)/(a*d-b*c);
            y=(e*c-a*f)/(a*d-b*c);
            if((b*f-e*d)%(a*d-b*c)!=0)
                continue;
            if((e*c-a*f)%(a*d-b*c)!=0)
                continue;
            if(x>max_x)
                max_x=x;
            if(x<min_x)
                min_x=x;
            if(y>max_y)
                max_y=y;
            if(y<min_y)
                min_y=y;
            vector<long long> temp;
            temp.push_back(x);
            temp.push_back(y);
            cross.push_back(temp);
      
        }
    }
    
    string tmp="";
    for(long long i=0;i<=max_y-min_y;i++){
        tmp="";
        for(long long j=0;j<=max_x-min_x;j++){
            tmp+='.';

        }
        answer.push_back(tmp);
    }
    long long yy=max_y-min_y;
    long long xx=max_x-min_x;
    for(long long i=0;i<cross.size();i++){

       answer[yy-(cross[i][1]-min_y)][cross[i][0]-min_x]='*';    

    }

    return answer;
}