프로그래머스 [평행]

ijnuyh·2025년 1월 26일

TIL

목록 보기
3/16

문제 설명

점 네 개의 좌표를 담은 이차원 배열
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
[[1, 4], [9, 2], [3, 81, [11, 61][3, 5], [4, 1], [2, 4], [5, 101]

result 0

🪄 나의 코드

정답 코드

def solution(dots):
    answer = 0

    # 가능한 모든 조합의 기울기를 비교
    for i in range(len(dots)):
        for j in range(i + 1, len(dots)):
            x1,y1 = dots[i]
            x2,y2 = dots[j]

            scope1 = (y2-y1) / (x2-x1)

            remaining = [dots[k] for k in range(len(dots)) if k != i and k != j]

            x3, y3 = remaining[0]
            x4, y4 = remaining[1]
            scope2 = (y4-y3) / (x4-x3)

            if scope1 == scope2:
                answer = 1
    return answer

반만 맞았던 코드

내가 간과한 사실 : 만약 기울기가 같더라도 같은 점을 가지고 나온 선이면 안됨.
만약에 (1)(3) 이랑 (2)(3) 의 점으로 만든 선이 평행하다고 친다면, error
"네개의 점을 두개씩이었을 때, 해당 두 직선이 평행이 되는 경우의 수"

def solution(dots):
    
    answer = 0
    gradient = []
    # 비교한 값들을 리스트에서 삭제
    # 그 뒤 동일한 값이 있으면 1.

    for i in range(3):
        dots_copy = dots

        for j in range(3-i):

            print(3-i,j)
            x = dots_copy[3-i][0] - dots_copy[j][0]
            y = dots_copy[3-i][1] - dots_copy[j][1]
            gradient.append(y/x)
            print(gradient)
    gradient_copy = gradient

    for k in range(5):
        gradient_copy = gradient
        num = gradient_copy[-1]
        gradient_copy.pop()
        print("비교 num", num)
        print("gradient_copy", gradient_copy)
        if num in gradient_copy:
            answer = 1
        
    return answer

다른 풀이방식

비구조화 할당, 구조분해

def solution(dots):
    [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]=dots
    answer1 = ((y1-y2)*(x3-x4) == (y3-y4)*(x1-x2))
    answer2 = ((y1-y3)*(x2-x4) == (y2-y4)*(x1-x3))
    answer3 = ((y1-y4)*(x2-x3) == (y2-y3)*(x1-x4))
    return 1 if answer1 or answer2 or answer3 else 0

생각해보니 x,y쌍이 4개뿐이면 경우의 수가 3가지밖에 안된다는 것을...
간단한 문제를 되돌아간 기분

profile
ad astra per aspera

0개의 댓글