2024. 8. 24. 18:00ㆍ코딩테스트 입문
https://school.programmers.co.kr/learn/courses/30/lessons/120875
문제 설명
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
- [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
제한사항
- dots의 길이 = 4
- dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
- 0 ≤ x, y ≤ 100
- 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
- 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
- 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.
입출력 예
dots | result |
[[1, 4], [9, 2], [3, 8], [11, 6]] | 1 |
[[3, 5], [4, 1], [2, 4], [5, 10]] | 0 |
입출력 예 설명
입출력 예 #1
- 점 [1, 4], [3, 8]을 잇고 [9, 2], [11, 6]를 이으면 두 선분은 평행합니다.
입출력 예 #2
- 점을 어떻게 연결해도 평행하지 않습니다.
각각 2개의 점을 이어 선분 2개를 만드는데, 이 두 선분이 평행한 경우가 있는지 확인하는 문제입니다.
평행이라고 하면 기울기가 같다라는 것과 동일한 의미죠, 기울기 공식을 사용해서 문제를 풀면 됩니다.
점을 잇는 방법이 많을 것 같지만 3개밖에 되지 않습니다.
1. 1 - 2 / 3 - 4
2. 1 - 3 / 2 - 4
3. 1 - 4 / 2 - 3
2개를 이으면 나머지 2개는 자동으로 이어지기 때문에 3가지 경우만 고려하면 됩니다.
파이썬으로 문제를 풀어보겠습니다.
def solution(dots):
answer = 0
# 1 - 2 / 3 - 4
inc1 = (dots[0][1] - dots[1][1]) / (dots[0][0] - dots[1][0])
inc2 = (dots[2][1] - dots[3][1]) / (dots[2][0] - dots[3][0])
if inc1 == inc2:
return 1
# 1 - 3 / 2 - 4
inc1 = (dots[0][1] - dots[2][1]) / (dots[0][0] - dots[2][0])
inc2 = (dots[1][1] - dots[3][1]) / (dots[1][0] - dots[3][0])
if inc1 == inc2:
return 1
# 1 - 4 / 2 - 3
inc1 = (dots[0][1] - dots[3][1]) / (dots[0][0] - dots[3][0])
inc2 = (dots[1][1] - dots[2][1]) / (dots[1][0] - dots[2][0])
if inc1 == inc2:
return 1
# 위의 모든 경우를 통과하지 못하면 0
return 0
dots를 바로 쓰다보니까 값이 좀 어지럽네요. 코드를 가독성 있게 바꾸면 다음과 같습니다.
def solution(dots):
[[x1, y1], [x2, y2], [x3, y3], [x4, y4]] = dots
# 1 - 2 / 3 - 4
answer1 = ((x1 - x2) * (y3 - y4) == (y1 - y2) * (x3 - x4))
# 1 - 3 / 2 - 4
answer2 = ((x1 - x3) * (y2 - y4) == (y1 - y3) * (x2 - x4))
# 1 - 4 / 2 - 3
answer3 = ((x1 - x4) * (y2 - y3) == (y1 - y4) * (x2 - x3))
return int(answer1 or answer2 or answer3)
dots의 값을 x1, y1 식으로 받아들습니다.
기울기 공식을 통해 얻은 기울기가 같은지 확인하는 게 핵심이기 때문에, 분모를 분자로 올려줄 수 있습니다.
이 식을
이렇게 표현할 수 있는 거죠.
각각의 answer에는 서로의 기울기가 같은지 연산 결과를 True, False로 저장합니다.
이걸OR 문으로 이어줌으로써 하나라도 있다면 True, 전부 없다면 False로 처리한 뒤, 정수로 형변환하면 1과 0을 얻을 수 있습니다.
점을 잇는 문제라 경우의 수가 많을 줄 알았는데 생각보다 적었네요.
'코딩테스트 입문' 카테고리의 다른 글
유한소수 판별하기 (0) | 2024.08.26 |
---|---|
겹치는 선분의 길이 (0) | 2024.08.25 |
저주의 숫자 3 (0) | 2024.08.23 |
외계어 사전 (0) | 2024.08.22 |
삼각형의 완성조건 (2) (0) | 2024.08.21 |