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 |