Data house
[python] 평행 - itertools 본문
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을 반환한다.
'Computer Knowledge > 코테 대비 오답노트' 카테고리의 다른 글
⭐️ [python] 예산 - 1단계지만 어려워 (0) | 2023.09.20 |
---|---|
[python] 3진법 변환 - divmod(), int() (0) | 2023.09.20 |
⭐️[python] 옹알이(1) - permutations, replace (0) | 2023.06.01 |
[python] 겹치는 선분 길이 - set, 합집합, 교집합 (0) | 2023.05.31 |
[python] 안전지대 - for, enumerate (0) | 2023.05.31 |