문제
문제 설명
점 네 개의 좌표를 담은 이차원 배열 dots가 다음과 같이 매개변수로 주어집니다.
- [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
주어진 네 개의 점을 두 개씩이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
입력 & 출력
입출력 예
dotsresult
[[1, 4], [9, 2], [3, 8], [10, 4]] | 1 |
[[3, 5], [4, 1], [2, 4], [5, 10]] | 0 |
풀이 과정
프로그래머스에서 0레벨문제가 많이 나와서 심심할 때마다 풀어보는 중에 이왕 풀 거면 정답률이 낮은 것부터 풀겠다고 생각하여서 풀게 되었습니다. 레벨이 낮은 문제였지만 생각 외로 반례에 대한 생각이 잘 나지 않아서 풀이가 오래 걸렸는데 밑에 그 힌트를 남겨두도록 하겠습니다.
1. 문제에서 주어지는 점들은 2개씩 묶어서 선으로써 기울기를 계산할 필요성이 있습니다. 이를 위해서 first_x, first_y : 첫번째 점의 x와 y 값 그 밑으로는 second, third, fourth를 순서대로 나타내어 줍니다.
2. 각각의 점들을 묶어서 위에 설명한 것처럼 기울기를 나타내고 두 직선의 기울기를 비교하여줍니다. 이 때 두 값이 같다면 평행한다고 생각할 수 있습니다.
3. 기울기는 점을 고를때 순서에 상관없이 반전이 되어도 기울기가 같으므로 첫 번째 점에서 그어지는 직선의 3가지 경우에 대해서만 결괏값을 확인하여 보면 평행하는 직선이 있는지 판별할 수 있습니다.
4. 코드 풀이중 분모 값이 0이 되는 경우가 있어서 이럴 경우에는 분모에는 0이 들어올 수 없다는 ZeroDivisionError가 나오게 되는데 이것을 방지하기 위하여 조건문에서 분모 값으로 들어가는 경우가 0이 아닐 때 계산하는 조건문을 넣어주었습니다.
** 4번이 에러를 막아주어서 많은 케이스를 커버해주긴 하였지만 결과적으로 4번의 문제 때문에 제출시 3,9번에 에러가 계속 나오는 문제가 생깁니다.
5. 이것을 방지 하기 위하여서는 y의 값이 같은 두 쌍의 점이 있는 경우에는 x축에 평행한 두 직선이 있는 경우이므로 이런 경우에도 평행한다는 추가적인 조건문 처리를 해주어야 합니다.
- 어려운 내용은 아니지만 위쪽의 식이 완벽히 모든 케이스를 커버한다고 생각하고 문제를 풀이하다 보니 마지막 처리가 안되어서 많은 시간을 사용한 문제였습니다.
- 해당 코드 부분은 밑과 같습니다.
if (first_y - second_y) == 0 and (third_y - fourth_y) == 0:
answer = 1
return answer
if (first_y - third_y) == 0 and (second_y - fourth_y) == 0:
answer = 1
return answer
if (first_y - fourth_y) == 0 and (third_y - second_y) == 0:
answer = 1
return answer
혹시라도 3, 9번에서 똑같은 에러가 발생하는 사람은 위의 해설 내용을 확인하면 도움이 되겠습니다.
참고용 반례 : [[1, 1], [5, 1], [1, 10], [3, 10]] , Return : 1
코드
코드1
def solution(dots):
answer = 0
dots.sort()
first_x = dots[0][0]
first_y = dots[0][1]
second_x = dots[1][0]
second_y = dots[1][1]
third_x = dots[2][0]
third_y = dots[2][1]
fourth_x = dots[3][0]
fourth_y = dots[3][1]
# case1 : 두번째 값과 직선
if (first_y - second_y) != 0 and (third_y - fourth_y) != 0:
if (first_x - second_x) / (first_y - second_y) == (third_x - fourth_x) / (third_y - fourth_y):
answer = 1
return answer
# case2 : 세번째 값과 직선
if (first_y - third_y) != 0 and (second_y - fourth_y) != 0:
if (first_x - third_x) / (first_y - third_y) == (second_x - fourth_x) / (second_y - fourth_y):
answer = 1
return answer
# case3 : 네번째 값과 직선
if (first_y - fourth_y) != 0 and (third_y - second_y) != 0:
if (first_x - fourth_x) / (first_y - fourth_y) == (third_x - second_x) / (third_y - second_y):
answer = 1
return answer
if (first_y - second_y) == 0 and (third_y - fourth_y) == 0:
answer = 1
return answer
if (first_y - third_y) == 0 and (second_y - fourth_y) == 0:
answer = 1
return answer
if (first_y - fourth_y) == 0 and (third_y - second_y) == 0:
answer = 1
return answer
return answer
코드 2 처음 생각해본 코드 결과적으로 문제가 있는 코드입니다.
def solution(dots):
answer = 0
dots.sort()
first_x = dots[0][0]
first_y = dots[0][1]
second_x = dots[1][0]
second_y = dots[1][1]
third_x = dots[2][0]
third_y = dots[2][1]
fourth_x = dots[3][0]
fourth_y = dots[3][1]
# case1 : 두번째 값과 직선
try:
if (first_x - second_x) / (first_y - second_y) == (third_x - fourth_x) / (third_y - fourth_y):
answer = 1
return answer
except ZeroDivisionError:
print("Zero")
pass
# case2 : 세번째 값과 직선
try:
if (first_x - third_x) / (first_y - third_y) == (second_x - fourth_x) / (second_y - fourth_y):
answer = 1
return answer
except ZeroDivisionError:
print("Zero")
pass
# case3 : 네번째 값과 직선
try:
if (first_x - fourth_x) / (first_y - fourth_y) == (third_x - second_x) / (third_y - second_y):
answer = 1
return answer
except ZeroDivisionError:
print("Zero")
pass
return answer
dots = [[1, 4], [9, 2], [3, 8], [10, 4]]
solution(dots)
'Algorithm' 카테고리의 다른 글
[프로그래머스] 소수 찾기 - 2번째 (0) | 2022.12.17 |
---|---|
[프로그래머스] 구명보트 (0) | 2022.10.22 |
[프로그래머스] 점프와 순간 이동 (0) | 2022.09.27 |
[프로그래머스] 주차 요금 계산 - 반례 (0) | 2022.09.27 |
[프로그래머스] 양궁 대회 (0) | 2022.09.27 |