Stay Hungry Stay Foolish

SWEA

[SWEA] 11736. 평범한 숫자 (Python/D3)

dev스카이 2024. 10. 29. 19:31

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


풀이

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}")