[Python] 백준 2230 수 고르기

    문제

     

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

     

    2230번: 수 고르기

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

    www.acmicpc.net

     

    해결

    투 포인터를 활용하였다

    - 두 수의 차가 목표값 보다 크면 최솟값을 갱신해준 후 start +=1 을 해주어야함

    - start += 1을 해주는 이유 : 리스트가 정렬되어있고, 목표값보다 크기 떄문에 start  값을 뺴주어야 하므로.. 

    import sys
    
    n, m = map(int, sys.stdin.readline().split())
    
    lst = []
    for i in range(n):
        lst.append(int(sys.stdin.readline()))
    lst.sort()
    
    start = 0
    end = 0
    min_value = sys.maxsize
    
    while start < n and end < n: # start, end가 모두 데이터 크기보다 작다면
        result = lst[end] - lst[start] # 그 차를 구함
        if result >= m: # 차가 목표값보다 더 크다면 
            min_value = min(lst[end] - lst[start], min_value) # 그 중 가장 작은값을 min_value에 넣음
            start += 1 # 그 후 start 포인터 하나 증가
        else: # 목표값보다 작다면 
            end += 1 # end 포인터 하나 증가
    print(min_value)

    'Algorithm > two pointer' 카테고리의 다른 글

    [Python] BOJ 13422 도둑  (0) 2023.12.06
    [Python] 백준 1806 부분합  (0) 2023.11.30
    [BOJ] 2003번 수들의 합2 - 구간합, 투포인터  (0) 2023.09.22
    [Python] 백준 1806 부분합  (0) 2022.06.06

    댓글