[문제 링크] 👇
풀이
min(), max() 를 이용하는 방법
- min() 과 max() 인자에 세 개의 값을 전달하여 각각 최솟값과 최댓값을 찾는다.
- 최솟값이 중간 값과 일치하지 않고, 최댓값이 중간 값과 일치하지 않으면 카운트 한다.
sorted() 를 이용하는 방법
- 세 개의 값을 sorted() 로 정렬하고 1번째 인덱스가 중간 값이면 카운트 한다.
Solution
T = int(input()) # 테스트 케이스 수
for test_case in range(1, T + 1):
N = int(input())
nums = list(map(int, input().split()))
result = 0
for i in range(1, N - 1): # 1, 2, 3
min_num = min(nums[i - 1], nums[i], nums[i + 1]) # 최솟값
max_num = max(nums[i - 1], nums[i], nums[i + 1]) # 최댓값
if min_num != nums[i] and max_num != nums[i]: # 최소나 최대가 아니면
result += 1
print(f"#{test_case} {result}")
이 문제는 nums[i]가 nums[i-1], nums[i], nums[i+1] 중간값인지 확인하면 되므로, 최솟값과 최댓값을 각각 구하는 대신 sorted를 사용해 가운데 값인지 비교하는 방식으로 최적화할 수 있다.
변경 사항 설명
- sorted([nums[i - 1], nums[i], nums[i + 1]])[1] == nums[i] 조건을 사용하여 nums[i]가 중간값인지 확인한다.
- 이는 nums[i]가 최솟값도 최댓값도 아닌지 체크하는 것을 더 효율적으로 수행할 수 있다.
최적화한 코드
T = int(input()) # 테스트 케이스 수
for test_case in range(1, T + 1):
N = int(input())
nums = list(map(int, input().split()))
result = 0
for i in range(1, N - 1): # i는 첫 번째와 마지막 요소를 제외한 중간 요소만
if sorted([nums[i - 1], nums[i], nums[i + 1]])[1] == nums[i]: # 중간값이면
result += 1
print(f"#{test_case} {result}")
'SWEA' 카테고리의 다른 글
[SWEA] 1228. [S/W 문제해결 기본] 8일차 - 암호문1 (Python/D3) (0) | 2024.10.30 |
---|---|
[SWEA] 5356. 의석이의 세로로 말해요 (Python/D3) (1) | 2024.10.29 |
[SWEA] 3499. 퍼펙트 셔플 (Python/D3) (0) | 2024.10.29 |
[SWEA] 1221. [S/W 문제해결 기본] 5일차 - GNS (Python/D3) (0) | 2024.10.26 |
[SWEA] 3142. 영준이와 신비한 뿔의 숲 (Python/D3) (0) | 2024.10.26 |