ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 교점에 별 만들기 C++
    프로그래머스(Programmers) 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;
    }
    반응형

    '프로그래머스(Programmers)' 카테고리의 다른 글

    프로그래머스 프렌즈4블록 C++  (0) 2022.07.14
    프로그래머스 2 x n 타일링  (0) 2022.07.07
    두 정수 사이의 합  (0) 2022.07.05
    프로그래머스 배달 C++  (0) 2022.07.01
    프로그래머스 피로도 C++  (0) 2022.05.24

    댓글

Designed by Who.