
문제 설명
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;
}
'Algorithm Study' 카테고리의 다른 글
[프로그래머스] 0단계 - 안전지대 (0) | 2023.12.22 |
---|---|
[프로그래머스] 0단계 - 겹치는 선분의 길이 (0) | 2023.12.22 |
[프로그래머스] 0단계 - 옹알이(1) (0) | 2023.12.20 |
[백준] 10026 적록색약 (0) | 2023.03.17 |
[백준] 7562 나이트의 이동 (0) | 2023.03.13 |