평행

2024. 8. 24. 18:00코딩테스트 입문

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 설명
점 네 개의 좌표를 담은 이차원 배열  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