728x90
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/120875
내 풀이
def solution(dots):
# 기울기가 같으면 평행(기울기 = y좌표차이/x좌표차이)
# 3개의 조건: 12/34 13/24 14/23
g1 = (dots[1][1]-dots[0][1]) / (dots[1][0]-dots[0][0])
g2 = (dots[3][1]-dots[2][1]) / (dots[3][0]-dots[2][0])
g3 = (dots[2][1]-dots[0][1]) / (dots[2][0]-dots[0][0])
g4 = (dots[3][1]-dots[1][1]) / (dots[3][0]-dots[1][0])
g5 = (dots[3][1]-dots[0][1]) / (dots[3][0]-dots[0][0])
g6 = (dots[2][1]-dots[1][1]) / (dots[2][0]-dots[1][0])
if g1==g2 or g3==g4 or g5==g6:
return 1
else:
return 0
주어진 점이 4개 밖에 없으므로, 직접 기울기를 구해서 비교해보았다.
기울기 = y좌표 차이 / x좌표의 차이
이며,
나올 수 있는 경우의 수는
1) 점1, 점2 과 점3, 점4 비교
2) 점1, 점3 과 점2, 점4 비교
3) 점1, 점4 와 점2, 점3 비교
의 3가지이므로, 단순히 직접 구해서 풀었다.
다른 사람 풀이
이 문제에서 주어진 점은 4개이지만, 만약 더 많은 점을 제공한다면 내가 푼 방식으로 풀기 어렵다.
[코드 1]
def solution(dots):
answer = 0
if gradient(dots[0], dots[1]) == gradient(dots[2], dots[3]) or gradient(dots[0], dots[2]) == gradient(dots[1], dots[3]) or gradient(dots[0], dots[3]) == gradient(dots[1], dots[2]):
answer = 1
return answer
def gradient(a, b):
return (a[1]-b[1])/(a[0]-b[0])
: 내가 푼 풀이와 같은 풀이이지만, 기울기를 구하는 부분을 함수로 따로 분리했다는 차이가 있다.
[코드 2]
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
: 배열의 값을 x1~x4, y1~y4에 할당하여 푼 풀이이다.
좌표를 할당하여 만들 수 있는 조합을 모두 계산하였고, 평행하다면 answer 1, 2, 3에 담긴 값 중 True가 나오게 된다.
[코드 3]
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
: 파이썬에서 제공하는 combination() 함수를 사용한 풀이이다.
다양한 점 중 나올 수 있는 조합을 뽑아, 그 점들의 기울기를 계산한다.
참고)
[코드 4]
from itertools import combinations
def solution(dots):
answer = 0
lines = list(combinations(dots, 2))
for L in lines:
# m은 L에 포함되지 않은 점으로 구성
m = [i for i in dots if i not in L]
L_g = (L[0][0]-L[1][0]) * (m[0][1]-m[1][1])
m_g = (m[0][0]-m[1][0]) * (L[0][1]-L[1][1])
if L_g == m_g:
answer += 1
return 1 if answer else 0
: 위와 비슷하지만, 복잡하게 인덱스를 생각하지 않고 모든 조합의 경우를 계산한 코드이다. (가장 마음에 든다!)
# 모든 조합 출력 시 나오는 값
[([1, 4], [9, 2]), ([1, 4], [3, 8]), ([1, 4], [11, 6]), ([9, 2], [3, 8]), ([9, 2], [11, 6]), ([3, 8], [11, 6])]
# for문에서 L, m, L_g, m_g 출력 결과
L: ([1, 4], [9, 2])
m: [[3, 8], [11, 6]]
-16 -16
L: ([1, 4], [3, 8])
m: [[9, 2], [11, 6]]
8 8
L: ([1, 4], [11, 6])
m: [[9, 2], [3, 8]]
60 -12
L: ([9, 2], [3, 8])
m: [[1, 4], [11, 6]]
-12 60
L: ([9, 2], [11, 6])
m: [[1, 4], [3, 8]]
8 8
L: ([3, 8], [11, 6])
m: [[1, 4], [9, 2]]
-16 -16
새로 배운 점
: 파이썬은 순열과 조합을 구할 수 있는 함수를 라이브러리로 제공한다.
순열(Permutations)
from itertools import combinations, permutations
nums = [1,2,3,4]
perm = list(permutations(nums, 2))
# [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
조합(Combinations)
from itertools import combinations, permutations
nums = [1,2,3,4]
combi = list(combinations(nums, 2))
# [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
+ 실제 코테를 풀 때 내가 이걸 기억해서 풀 수 있을까? 🧐
728x90
'코딩테스트 > PYTHON' 카테고리의 다른 글
[프로그래머스][PYTHON] Lv. 0 겹치는 선분의 길이 (0) | 2024.04.09 |
---|---|
[프로그래머스][PYTHON] Lv. 0 옹알이 (1) (0) | 2024.04.05 |
[프로그래머스][PYTHON] Lv. 0 연속된 수의 합 (0) | 2024.04.02 |
[프로그래머스][PYTHON] Lv. 0 다음에 올 숫자 (0) | 2024.04.02 |
[프로그래머스][PYTHON] Lv. 0 특이한 정렬 (0) | 2024.04.02 |