Coding Test/BaekJoon_Python

백준 2230 <수 고르기> Python

JunOnJuly 2023. 11. 9. 22:22
728x90

https://www.acmicpc.net/problem/2230

 

2230번: 수 고르기

N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어

www.acmicpc.net


전형적인 투포인터 문제입니다. 두 포인터의 차이가 목표보다 크면 하위 포인터를 옮겨 차이를 줄이고 목표보다 작으면 상위 포인터를 옮겨 차이를 늘리면서 최소 길이를 비교해나갑니다.


def solution(N, M, data_list):
    # 정렬
    data_list = sorted(data_list)
    # 차이의 최솟값
    min_sub = 2000000000
    # 투포인터
    left = 0
    right = 1
    while True:
        # right 가 범위를 벗어나면
        if right >= N:
            return min_sub
        # 포인터에 해당하는 값
        left_value = data_list[left]
        right_value = data_list[right]
        # 차이
        sub = right_value - left_value
        # 차이가 M이면
        if sub == M:
            return M
        # 차이가 M보다 크면
        elif sub > M:
            # 최솟값 최신화
            if min_sub > sub:
                min_sub = sub
            # 왼쪽 포인터 + 1
            left += 1
            continue
        # 차이가 M보다 작으면
        else:
            # 오른쪽 포인터 + 1
            right += 1
            continue


N, M = map(int, input().split())
data_list = [int(input()) for _ in range(N)]
print(solution(N, M, data_list))

 

728x90

'Coding Test > BaekJoon_Python' 카테고리의 다른 글

백준 1644 <소수의 연속합> Python  (0) 2023.11.10
백준 2668 <숫자고르기> Python  (0) 2023.11.09
백준 2217 <로프> Python  (0) 2023.11.08
백준 1026 <보물> Python  (0) 2023.11.08
백준 1931 <회의실 배정> Python  (0) 2023.11.07