BOJ
[BOJ] 2230. 수 고르기
rubato.dev
2025. 7. 14. 16:25
📌 문제 제목
문제 링크: BOJ 2230
🗒️ 문제 설명
N개의 정수로 이루어진 수열이 있을 때, 이 수열에서 두 수를 골랐을 때 그 차이가 M 이상이면서 제일 작은 경우를 구하여라.
시간 제한: 2초
메모리 제한: 128MB
1 <= N <= 100,000
0 <= M <= 2,000,000,000
0 <= |A[i]| <= 1,000,000,000
💡 문제 해결 아이디어
- N이 최대 100,000 이기 때문에 O(N log N) 이하의 시간복잡도를 가지는 알고리즘 사용
- 정렬을 시킨다면 st가 증가할 때 en이 줄어들 수 없으므로 O(N)의 시간복잡도를 가지는 투 포인터를 사용할 수 있다.
- 입력이 정렬되어 있지 않으므로 수를 정렬 - O(N log N)
- st를 0으로 잡고 두 수의 차가 M 이상일 때까지 en을 증가시킴.
- 처음 M 이상인 지점에 두 수의 차를 answer과 비교
⌛️ 시간 복잡도
- O(N log N)
- 정렬에 O(N log N)
- 투 포인터에 O(N)
✅ 최종 코드
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
seq = [int(input().strip()) for _ in range(N)]
en = 0
answer = float("inf")
seq.sort()
for st in range(N):
while en < N and seq[en] - seq[st] < M:
en += 1
if en == N:
break
answer = min(answer, seq[en] - seq[st])
print(answer)