Data house

[python] 평행 - itertools 본문

Computer Knowledge/코테 대비 오답노트

[python] 평행 - itertools

l._.been 2023. 6. 7. 13:33
728x90
문제

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

 

프로그래머스

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

programmers.co.kr

제한사항

  • dots의 길이 = 4
  • dots의 원소는 [x,y] 형태이며 x,y는 정수입니다.
    • 0 <= x, y <= 100
  • 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
  • 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
  • 임의의 두 점을 이은 직선이  x축 또는 y축과 평행한 경우는 주어지지 않습니다.
나의 풀이
import itertools
def solution(dots):
    cnt = 0
    arr = []
    
    for x,y in itertools.combinations(dots, 2):
        a,b = [k for k in dots if k not in [x,y]]
        arr.append([x,y,a,b])
    arr = arr[:len(arr)//2]
    
    for i in range(len(arr)):
        a,b,c,d = arr[i][0],arr[i][1], arr[i][2],arr[i][3]
        line1 = (b[1]-a[1]) / (b[0]-a[0])
        line2 = (d[1]-c[1]) / (d[0]-c[0])
        if line1 and line2 and line1 == line2:
            cnt = 1
            
            
    #     print(a, a[0], a[1], b, b[0], b[1], c,c[0],c[1],d,d[0],d[1])  
    #     print(b[1]-a[1], b[0]-a[0], line1)
    #     print(d[1]-c[1], d[0]-c[0], line2)
    # print(cnt,len(arr))
    return cnt

풀이과정

  • dots에서 원소들의 2가지를 묶었을 때 조합을 구성하여 arr 변수에 담음
  • 각각의 기울기를 구하기 위해 line1, line2 변수를 사용하여
  • 만약 line1,line2가 존재하고 이 둘이 같은 값을 가진다면 평행하다고 판단하여 cnt값을 1로 변경시켜주었다

아쉬운 점

- dots가 4개라는 점을 이용할걸 그랬다..

 

인상깊은 풀이
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

dots를 리스트로 매핑해서 answer1, answer2, answer3에 기울기가 서로 같은지 검사를 한다.

만약 이들 중에 하나라도 같으면 1을 반환하고 그렇지 않으면 0을 반환한다.