이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

코딩테스트

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

이쿠우우 2022. 4. 15. 19:09
반응형

 

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

 

코딩테스트 연습 - 교점에 별 만들기

[[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]

계산할 때, 10만*10만은 int형 범위를 벗어나니 int가 아닌 long long을 사용해야함.
long long의 최대값, 최소값을 고려해야함.
vector의 경우 push_back 보다 assign 으로 값을 초기화 해줘야 속도가 빠름.

#include <string>
#include <vector>
#include <iostream>

using namespace std;


vector<string> solution(vector<vector<int>> line) {
    vector<string> answer;
    
    vector<vector<long long>> result;
    
    long long minX=10000000001;
    long long minY=10000000001;
    long long maxX=-10000000001;
    long long maxY=-10000000001;
        
    
    for(int i=0; i < line.size(); i++){        
        long long standardX = line[i][0];
        long long standardY = line[i][1];
        long long standardNum = line[i][2];
        for(int k=i+1; k < line.size(); k++){
            long long nowX = line[k][0];
            long long nowY = line[k][1];
            long long nowNum = line[k][2];
            
            long long check=0;
            long long getX=0;
            long long getY=0;  
            long long under = (standardX*nowY) - (standardY*nowX);            
            long long up = (standardY*nowNum) - (standardNum*nowY);            
            if(0==under){
                continue;
            }
            
            if((0 != under) && (0 != up)){
                check = up % under;
                if(0 != check){
                    continue;
                }
                getX = up/under;
            }                        
                      
            up = (standardNum*nowX) - (standardX*nowNum);
            if((0 != under) && (0 != up)){
                check = up % under;
                if(0 != check){
                    continue;
                }
                getY = up/under;
            }            
            vector<long long> temp = {getX, getY};            
            result.push_back(temp);         
            if(minX > getX){
                minX=getX;
            }            
            if(minY > getY){
                minY=getY;
            }
            if(maxX < getX){
                maxX = getX;
            }
            if(maxY < getY){
                maxY = getY;
            }
        }
    } 
        
    long long mapX = maxX - minX+1;
    long long mapY = maxY - minY+1;  
    
    string mapTemp(mapX, '.');    
    answer.assign(mapY, mapTemp);
    
    
    for(vector<long long> temp : result){   
        temp[0] = temp[0]+(minX* (-1));
        temp[1] = (temp[1]-maxY) * (-1); 
        answer[temp[1]][temp[0]] = '*';        
    }    
    
    
    return answer;
}





꾸준히 하다보면 실력이 늘겠지..

반응형