[프로그래머스] LV.0 평행

seho·2023년 2월 21일
0

codetest

목록 보기
8/17
post-thumbnail

문제

점 네 개의 좌표를 담은 이차원 배열  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. 두 개의 점을 선택하여 선분을 만드는데 가능한 모든 선분을 만들어야 하므로, 네 점 중 두 개를 선택하는 모든 경우의 수를 고려해야 한다. 이를 위해 itertools 모듈의 combinations 함수를 사용합니다.
  2. 선택한 두 점이랑 겹치지 않는 다른 두 점들을 찾고
  3. 각 두 점을 이용하여 만들어진 선분의 기울기를 계산한다. 기울기는 y 차이를 x 차이로 나누어 구할 수 있다. (y2-y1)/(x2-x1)
  4. 각 직선들의 기울기를 절대 값으로 비교하여 같은 값이 있으면 1을 return 해주고 없다면 0을 return 해준다.
import itertools

def solution(dots):
    answer = 0
    comb = itertools.combinations(dots,2)
    
    for c1 in comb:
        print(c1)
        # 기울기 1
        gak1 = (list(c1)[0][1]-list(c1)[1][1])/(list(c1)[0][0]-list(c1)[1][0])
        
        for c2 in comb:
            if c1[0] not in c2 and c1[1] not in c2:
                # 기울기 2
                gak2 = (list(c2)[0][1]-list(c2)[1][1])/(list(c2)[0][0]-list(c2)[1][0])
                
                # 기울기 1,2 비교
                if abs(gak1) == abs(gak2):
                    return 1
                else:
                    return 0
  • itertools를 import 해주고 comobinations() 함수로 해당 리스트에서 2개 요소씩 중복되지 않에 comb에 튜플로 저장해준다.
  • for 문으로 comb 요소를 한 번씩 사용해주는데 먼저 요소의 기울기 값 gak1을 정의해준다.
  • c1 직선과 중복되지 않는 튜플 c2를 추출해주고 gak2 값을 정의해준다.
  • gak1과 gak2의 절대값으로 비교하여 만약 같은 기울기가 있다면 1을 return 해준다.

오답노트

  • intertools의 combinations() 함수를 사용할 줄 몰랐다.
  • 기울기는 y의 차를 x의 차로 나누어주면 구할 수 있다.
  • 2차원 배열이 어렵다 더 공부해두면 좋을 것 같다.
profile
develop my'self and sw

0개의 댓글