프로그래머스 | 평행 [파이썬 python]

2023. 3. 15. 20:19·Algorithm/프로그래머스
 

프로그래머스

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

programmers.co.kr

 

코드

from itertools import combinations

def solution(dots):
    answer = 0
    
    combi = list(combinations(dots, 2)) # 네 점에서 두 개씩 조합
    # 조합의 결과는 정렬되어 나오기 때문에 대칭으로 짝을 이룸 -> 그러므로 절반까지만 for문
    for i in range(len(combi)//2): 
        dx1, dy1 = combi[i][0][0] - combi[i][1][0], combi[i][0][1]-combi[i][1][1]
        dx2, dy2 = combi[-(i+1)][0][0]-combi[-(i+1)][1][0], combi[-(i+1)][0][1]-combi[-(i+1)][1][1]
        d1 = dy1/dx1 # 직선1 기울기
        d2 = dy2/dx2 # 직선2 기울기
        
        if d1 == d2: # 두 직선의 기울기가 같으면(=평행) 1
            answer = 1
            break
        answer = 0 # 어떠한 경우에도 평행하지 않으면 0

    return answer

4개의 점의 좌표를 가지고 있는 리스트 dots가 주어지면, 점을 두 개씩이었을 때 만들어지는 두 직선이 평행한 지 판별하는 문제이다.

 

먼저, 4개의 점에서 2개의 점을 선택하기 위해 조합을 사용하였다.

dots는 [[1, 4], [9, 2], [3, 8], [11, 6]]와 같이 2차원 배열로 주어지기 때문에 2차원 배열에서 itertools의 combinations를 사용하면 ([1, 4], [9, 2]) 이런 형태로 결과가 나오게 된다.

combi = list(combinations(dots, 2))

또한 combinations의 결과는 정렬되어 나오기 때문에 0번째 인덱스에 위치한 두 좌표는 마지막 인덱스에 위치하는 두 좌표와 한 쌍이 될 수 있다.

 

여기서 한 쌍이라는 의미는 ([1, 4], [9, 2]) 가 선택되고 남은 나머지 두 좌표를 의미하는 것이다.

0번 인덱스는 5번 인덱스(-1번 인덱스)와
1번 인덱스는 4번 인덱스(-2번 인덱스)와
2번 인덱스는 3번 인덱스(-3번 인덱스)와

한 쌍이라고 볼 수 있다.

그래서 dx, dy를 구하는 과정에서 인덱스 접근을 -(i+1)로 하게 된 것이다.

 

두 직선이 평행한 지 판별하기 위해서는 기울기가 같아야 한다.

따라서 combi의 0번 인덱스에 위치한 두 좌표의 x값은 x값끼리 y값은 y값끼리 빼서 dx1, dy1에 저장해 주고, -1번 인덱스에 위치한 두 좌표의 x값은 x값끼리 y값은 y값끼리 빼서 dx2, dy2에 저장해 주었다.

직선의 기울기는 $\frac{dy}{dx}$ 이므로 각각의 기울기를 구해 d1, d2로 저장해 두 기울기가 같은 지 비교하였다.

기울기가 같으면 평행한 두 직선이므로 answer = 1을 해준다. 이때, break를 하는 이유는 두 직선이 평행이 되는 경우가 한 번만 있어도 1을 리턴하기 때문이다. 

만약 이번 요소가 평행이어서 answer = 1로 바꿨지만, combi의 다음 요소가 평행이 아닐 경우 다시 answer=0이 되기 때문에 1이 되면 이후의 경우는 생각하지 않고 반복문을 종료해 주는 것이다.

 

dots에는 4개의 점만 있다고 명시되어 있기 때문에 두 직선을 만들 수 있는 경우의 수는 12/34 13/24 14/23 세 가지뿐이다. 그렇기 때문에 변수나 반복문 없이 직접 기울기를 구해봐도 된다.

반응형
저작자표시 (새창열림)
'Algorithm/프로그래머스' 카테고리의 다른 글
  • 프로그래머스 | 유한소수 판별하기 [파이썬 python]
  • 프로그래머스 | 겹치는 선분의 길이 [파이썬 python]
  • 프로그래머스 | 안전지대 [파이썬 python]
  • 프로그래머스 | 숨어있는 숫자의 덧셈(2) [파이썬 python]
dduniverse
dduniverse
  • dduniverse
    dduniverse
    dduniverse
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • Algorithm (123)
        • 알고리즘 이론 (8)
        • 백준 (19)
        • 프로그래머스 (83)
        • 구름 알고리즘 먼데이 챌린지 (13)
      • 빅데이터분석기사 (10)
        • 통계 (4)
        • 실기 (6)
      • KT에이블스쿨 (26)
      • FrontEnd (11)
        • React (5)
        • 기타 (6)
      • BackEnd (18)
        • Django (15)
        • Spring (3)
      • DS & ML (11)
        • Machine Learning (9)
        • Kaggle (2)
      • TIL (43)
        • python (22)
        • javascript (3)
        • 오류해결 (10)
        • 기타 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 관리
    • 글쓰기
  • 링크

  • 인기 글

  • hELLO· Designed By정상우.v4.10.0
dduniverse
프로그래머스 | 평행 [파이썬 python]
상단으로

티스토리툴바