문제 정의
주어진 두 점 A(x1, y1)와 B(x2, y2)에 대해 선분 AB의 방향을 구하는 문제입니다. 선분의 방향은 A에서 B로 향하는 과정에서 x축과 y축이 어떻게 변화하는지를 반영합니다. 이때, AB의 방향이 상단을 향하는지, 하단을 향하는지, 좌측 또는 우측으로 향하는지를 판단해야 합니다.
문제는 다음과 같습니다:
정수 4개 x1, y1, x2, y2가 주어질 때, 선분 AB의 방향을 판단하세요.
- 0: 수평선 (y1 == y2)
- 1: 상단을 향함 (y1 < y2)
- -1: 하단을 향함 (y1 > y2)
- 2: 우측으로 향함 (x1 < x2)
- -2: 좌측으로 향함 (x1 > x2)
문제 분석
선분 A에서 B로의 방향을 구하기 위해서는 두 점의 x좌표와 y좌표를 비교해야 합니다. 아래의 경우를 고려합니다.
- y좌표가 동일하면, 선분은 수평선으로 간주된다 (y1 == y2).
- A의 y좌표가 B의 y좌표보다 작으면, 선분은 상단을 향한다 (y1 < y2).
- A의 y좌표가 B의 y좌표보다 크면, 선분은 하단을 향한다 (y1 > y2).
- A의 x좌표가 B의 x좌표보다 작으면, 선분은 우측으로 향한다 (x1 < x2).
- A의 x좌표가 B의 x좌표보다 크면, 선분은 좌측으로 향한다 (x1 > x2).
이러한 조건들을 통해 문제를 해결할 수 있습니다.
알고리즘 설계
문제를 해결하기 위해 다음과 같은 알고리즘을 설계합니다:
- 두 점 A(x1, y1)와 B(x2, y2) 좌표를 입력받는다.
- y1, y2를 비교하여 세 가지 경우 (수평, 상단, 하단)로 결과를 정한다.
- x1, x2를 비교하여 우측 또는 좌측으로 향하는 경우를 정의한다.
- 결과를 출력한다.
구현
아래는 위의 알고리즘을 스위프트로 구현한 코드입니다:
import Foundation
func determineDirection(x1: Int, y1: Int, x2: Int, y2: Int) -> String {
if y1 == y2 {
return "수평선"
} else if y1 < y2 {
return "상단을 향함"
} else {
return "하단을 향함"
}
}
func determineHorizontalDirection(x1: Int, x2: Int) -> String {
if x1 < x2 {
return "우측으로 향함"
} else if x1 > x2 {
return "좌측으로 향함"
} else {
return "수직선"
}
}
let x1 = 1, y1 = 2, x2 = 3, y2 = 4
print(determineDirection(x1: x1, y1: y1, x2: x2, y2: y2))
print(determineHorizontalDirection(x1: x1, x2: x2))
위의 스위프트 코드에서는 두 개의 함수를 사용하여 선분의 방향을 구분합니다. 첫 번째 함수 determineDirection
는 y좌표를 기준으로 방향을 판단하고, 두 번째 함수 determineHorizontalDirection
는 x좌표를 기준으로 방향을 판단합니다. 또한, 각 경우에 따라 적절한 문자열을 반환합니다.
테스트 케이스
이제 몇 가지 테스트 케이스를 살펴보겠습니다:
- 케이스 1: A(1, 2)에서 B(3, 4)로 향하는 선분
- 케이스 2: A(1, 3)에서 B(1, 3)로 수평선
- 케이스 3: A(5, 6)에서 B(2, 5)로 향하는 선분
각 테스트 케이스에 대한 결과를 통해 알고리즘을 검증합니다:
// 케이스 1: A(1, 2), B(3, 4)
let x1_case1 = 1, y1_case1 = 2, x2_case1 = 3, y2_case1 = 4
print(determineDirection(x1: x1_case1, y1: y1_case1, x2: x2_case1, y2: y2_case1)) // 상단을 향함
print(determineHorizontalDirection(x1: x1_case1, x2: x2_case1)) // 우측으로 향함
// 케이스 2: A(1, 3), B(1, 3)
let x1_case2 = 1, y1_case2 = 3, x2_case2 = 1, y2_case2 = 3
print(determineDirection(x1: x1_case2, y1: y1_case2, x2: x2_case2, y2: y2_case2)) // 수평선
print(determineHorizontalDirection(x1: x1_case2, x2: x2_case2)) // 수직선
// 케이스 3: A(5, 6), B(2, 5)
let x1_case3 = 5, y1_case3 = 6, x2_case3 = 2, y2_case3 = 5
print(determineDirection(x1: x1_case3, y1: y1_case3, x2: x2_case3, y2: y2_case3)) // 하단을 향함
print(determineHorizontalDirection(x1: x1_case3, x2: x2_case3)) // 좌측으로 향함
결론
이번 포스트에서는 주어진 두 점에 대해 선분의 방향을 구하는 알고리즘을 설계하고 구현하는 과정을 살펴보았습니다. 이 알고리즘은 주어진 두 좌표의 비교를 통해 간단하게 방향성을 판단할 수 있었습니다.
선분 방향 구하기 문제는 기본적인 기하학적 접근이 필요하며, 각 조건을 명확히 이해하고 그에 따른 로직을 작성하는 것이 중요합니다. 이러한 문제를 통해 알고리즘적 사고를 기르고 실력을 향상시킬 수 있습니다.