숫자로 이루어진 리스트가 주어졌을 때, 해당 리스트가 엄격하게 증가하는지 또는 엄격하게 감소하는지 확인해야 합니다. 여기서 '엄격하게'라는 것은 인접한 두 요소가 같은 값을 가질 수 없다는 의미입니다.
예를 들어 입력이 nums = [10, 12, 23, 34, 55]라면 출력은 True가 됩니다. 모든 요소가 서로 다르고 각 요소가 바로 앞의 요소보다 크기 때문에, 이 리스트는 엄격하게 증가하는 리스트이기 때문입니다.
문제 해결 접근 방법
이 문제는 다음 단계를 통해 해결할 수 있습니다.
- nums의 길이가 2 이하라면 True를 반환합니다. (요소가 2개 이하일 때는 항상 조건을 만족)
- nums의 모든 요소가 고유하지 않다면(중복이 있다면) False를 반환합니다.
- ordered := nums를 오름차순으로 정렬한 리스트로 설정합니다.
- nums가 ordered와 같거나, ordered를 뒤집은 결과와 같으면 True를 반환하고, 그렇지 않으면 False를 반환합니다.
구현 예제
아래 구현을 통해 더 잘 이해할 수 있습니다.
class Solution: def solve(self, nums): if len(nums) <= 2: return True if len(set(nums)) != len(nums): return False ordered = sorted(nums) return nums == ordered or nums == ordered[::-1] ob = Solution() print(ob.solve([10, 12, 23, 34, 55]))
입력
[10, 12, 23, 34, 55]
출력
True
코드 설명
이 코드의 핵심 로직은 다음과 같습니다.
- 길이 검사: 요소가 2개 이하인 리스트는 항상 엄격하게 증가하거나 감소한다고 볼 수 있으므로 True를 반환합니다.
- 중복 검사: set(nums)의 길이와 원래 리스트의 길이를 비교하여 중복 요소가 있는지 확인합니다. 중복이 있으면 엄격한 조건을 만족할 수 없습니다.
- 정렬 비교: 정렬된 리스트와 원본 리스트가 일치하면 엄격하게 증가하는 것이고, 정렬된 리스트의 역순과 일치하면 엄격하게 감소하는 것입니다.
이 방법의 시간 복잡도는 정렬에 의해 지배되므로 O(n log n)이며, 공간 복잡도는 정렬된 복사본을 저장하기 위해 O(n)입니다.