공부 기록장

[백준 - Python] 2230. 수 고르기 본문

코딩 테스트/백준 문제 풀이

[백준 - Python] 2230. 수 고르기

빛나무 2024. 8. 8. 00:17

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

 

코드

import sys
input = sys.stdin.readline

n, m = map(int, input().split())
arr = [int(input()) for _ in range(n)]
arr.sort()

end = 1
ans = int(2e9)
for i in range(n):
    while arr[end] - arr[i] < m and end < n-1:
        end += 1
    if arr[end] - arr[i] >= m:
        ans = min(ans, arr[end] - arr[i])

print(ans)

'''
n개의 정수 수열
두 수를 골랐을 때(같은 수 가능), 그 차이가 M 이상이면서 제일 작은 경우?
'''

 

접근 방식

1. 투포인터 사용하기 위해 수열 정렬

2. 시작점은 0, 끝점은 1에서 시작 (같은 수 불가능)

3. 문제에서 제시한 `차이 m 이상` 조건과 인덱스 범위 조건을 만족하는 동안, 끝점 이동시키기

4. `차이 m 이상` 조건 만족시에는 최소값 갱신

 

배운 점

1. 투포인터 풀이는

   (1) 포인터 초기화 후, 무한 루프 내의 조건식으로 포인터 이동 및 반복문 탈출하는 방식과

   (2) 포인터 하나는 반복문으로 돌리고, 나머지 포인터는 조건에 따라 이동시키는 방식이 가능하다

2. 최솟값 저장하는 변수를 처음에 큰 수로 초기화 할 때, 문제의 조건에 맞는 최대값으로 설정하는 것이 좋다