문제 개요
범위 [l, u]의 하한값과 상한값이 주어졌을 때, 해당 범위에 포함된 모든 숫자를 곱한 결과가 양수인지, 음수인지, 아니면 0인지 판별해야 합니다.
예를 들어 l = -8, u = -2가 입력으로 주어진 경우, 범위 내 값은 [-8, -7, -6, -5, -4, -3, -2]이며, 이들의 곱은 -40320입니다. 따라서 출력 결과는 "Negative"(음수)가 됩니다.
해결 접근 방식
범위의 모든 숫자를 실제로 곱하면 비효율적일 수 있으므로, 부호의 성질을 이용해 논리적으로 판단하는 것이 핵심입니다. 다음 단계로 문제를 해결할 수 있습니다.
- 만약 l과 u가 모두 양수라면:
- "Positive"(양수)를 반환합니다. 범위 내 모든 수가 양수이므로 곱도 반드시 양수입니다.
- 그렇지 않고 l이 음수 또는 0이고 u가 0 또는 양수라면:
- "Zero"를 반환합니다. 이 경우 범위에 0이 포함되므로 곱은 반드시 0이 됩니다.
- 그 외의 경우 (즉, l과 u가 모두 음수):
- n := |l - u| + 1로 범위 내 숫자의 개수를 구합니다.
- n이 짝수라면 "Positive"를 반환합니다. 음수를 짝수 번 곱하면 결과는 양수입니다.
- n이 홀수라면 "Negative"를 반환합니다. 음수를 홀수 번 곱하면 결과는 음수입니다.
예제 코드
def solve(l,u):
if l > 0 and u > 0:
return "Positive"
elif l <= 0 and u >= 0:
return "Zero"
else:
n = abs(l - u) + 1
if n % 2 == 0:
return "Positive"
return "Negative"
l = -8
u = -2
print(solve(l,u))입력
-8, -2
출력
Negative
동작 원리 설명
위 코드에서 l = -8, u = -2가 입력되면 두 값이 모두 음수이므로 else 블록으로 진입합니다. n = |-8 - (-2)| + 1 = 6 + 1 = 7이 되고, 7은 홀수이므로 최종적으로 "Negative"가 출력됩니다.
이 알고리즘의 시간 복잡도는 O(1)로, 범위 크기와 관계없이 상수 시간 안에 답을 구할 수 있다는 장점이 있습니다. 만약 범위가 매우 넓다면 실제로 모든 수를 곱하는 방식 대신 이러한 부호 기반 판별 방법이 훨씬 효율적입니다.