https://school.programmers.co.kr/learn/courses/30/lessons/120875
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<int>> dots) {
int answer = 0;
if((dots[1][1]-dots[0][1])*(dots[3][0]-dots[2][0])==(dots[3][1]-dots[2][1])*(dots[1][0]-dots[0][0])) return 1;
if((dots[2][1]-dots[0][1])*(dots[3][0]-dots[1][0])==(dots[3][1]-dots[1][1])*(dots[2][0]-dots[0][0])) return 1;
if((dots[3][1]-dots[0][1])*(dots[2][0]-dots[1][0])==(dots[2][1]-dots[1][1])*(dots[3][0]-dots[0][0])) return 1;
return 0;
}
판단해야 할 경우의 수가 3가지 이기 때문에 함수를 만들지 않고 이렇게 구현했다. 만약 판단해야 하는 경우의 수가 많다면, 함수를 만들어서 해당 함수에 원소들을 넣어주는 형태로 작성하는게 좋을것이다.
다른 사람의 풀이를 볼때, 반복문을 이용해서 계산해야 하는 조합들을 넣어주는 형태의 풀이가 있어서 첨부해본다.
충분히 매력적이게 잘 짠 풀이다.
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int solution(vector<vector<int>> dots) {
// 각각 페어가 되는 경우의 수
vector<vector<int>> pairs = {
{0, 1, 2, 3},
{0, 2, 1, 3},
{0, 3, 1, 2}
};
for (vector<int> xy : pairs) {
int mul1 = (dots[xy[1]][1] - dots[xy[0]][1]) * (dots[xy[3]][0] - dots[xy[2]][0]);
int mul2 = (dots[xy[1]][0] - dots[xy[0]][0]) * (dots[xy[3]][1] - dots[xy[2]][1]);
if (mul1 == mul2) {
return 1;
}
}
return 0;
}
위 프로그램의 경우는, 경우의 수들을 pairs 라는 이름의 이중vector를 이용해서 표현하고, 해당 row 별로, 원소들에 위치에 접근해서
기울기가 서로 같다고 할때, 밑과 분모들을 서로 등호 넘어로 넘겨서 곱하기 계산을 통해서 그 값이 서로 같다 라는 형태로 변경해서 기울기가 같다는 형식과 동일한 값을 찾아내는 방법으로 구현하였다.
나 또한 이런식으로 구현하였는데, 그렇게 구한 이유는, 만약 이런식으로 구하지 않고 / 라는 나누기 연산자를 활용하면, 해당 값들을 double 로 계산하거나 float으로 계산하지 않으면, 각 원소들이 int 이므로 인트의 연산상 소수점 이하 부분이 잘릴것이기 때문에 제대로 동작하지 않으니까 그걸 고려해서 캐스팅 해야하는데, 그렇게 하는 과정을 덜기 위해서 위와 같은 연산으로 수정해서 나누기 연산을 수행하지 않은것이다.
프로그램을 작성할때, 특히 c나 c++ 로 작성할때 int 형의 경우는 뒤에 있는 소수점 이하 값들이 잘려나간다는걸 잊지 말고 제대로 이해하고 이용하도록 하자.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| Lv 0. 유한소수 판별하기. *다시 풀어보기* (0) | 2023.10.08 |
|---|---|
| Lv 0. 겹치는 선분의 길이. *다시 풀어보기* (0) | 2023.10.08 |
| Lv 0. 저주의 숫자 3 (0) | 2023.10.07 |
| Lv 0. 외계어 사전 - string 속에서 string을 찾으려면 find() 함수를, 못찾으면 string::npos를 떠올리자. *다시 풀어보기* (0) | 2023.10.06 |
| Lv 0. 삼각형의 완성조건 (2) (0) | 2023.10.06 |
