문제 설명

4개의 점이 주어졌고, 점을 2개씩 이었을 때 두 직선이 평행이 되는 경우가 있으면 1 아니면 0을 return

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

 

문제 풀이법

총 3가지 경우의 수가 주어진다

1. 0번째와 1번째, 2번째와 3번째를 이었을 때

2. 0번째와 2번째, 1번째와 3번째를 이었을 때

3. 0번째와 3번째, 1번째와 2번째를 이었을 때

 

평행인지 아닌지는 기울기를 통해서 알 수 있다

기울기가 같으면 평행이다

기울기는 "세로 / 가로"로 구한다

 

단순히 저 3개의 경우를 다 나열하면서 풀어도 되지만, 뭔가 for문을 가지고 풀고싶었다

따라서 list[3][4]라는 배열을 두어 for문을 3번씩 돌면서 각 기울기를 비교하도록 하였다

list[3][4]에서 2차원의 의미는 총 3개의 경우의 수이고, 1차원의 의미는 dots의 인덱스 번호이다

즉, list[1]을 보면 {0, 2, 1, 3}인데 2번째 경우의 수에서 dots의 0,2 번째 인덱스, dots의 1,3번째 인덱스끼리 비교하겠다는 소리이다

 

다시말하지만 이렇게 한 이유는 굳이 같은 코드를 여러번 쓰기 싫어서이다

 

 

주의할 점

1. 평행의 개수를 반환하는 것이 아니라, 평행이 있는 경우는 1, 아닌 경우는 0으로 반환해야한다

2. 기울기만 double을 쓰는 것이 아니라 width와 height 모두 double을 사용해야한다

 

소스 코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> dots) {
    int answer = 0;
    
    int list[3][4] = {{0, 1, 2, 3},
                      {0, 2, 1, 3},
                      {0, 3, 1, 2}};
    
    for (int i = 0; i < 3; i++) {
        double width1 = dots[list[i][0]][0] - dots[list[i][1]][0];
        double height1 = dots[list[i][0]][1] - dots[list[i][1]][1];
        
        double gradient1 = height1 / width1;
        
        double width2 = dots[list[i][2]][0] - dots[list[i][3]][0];
        double height2 = dots[list[i][2]][1] - dots[list[i][3]][1];
        
        double gradient2 = height2 / width2;
        
        if (gradient1 == gradient2) {
            answer = 1;
            break;
        }
    }
    
    return answer;
}
복사했습니다!