백준 알고리즘 2230번
https://www.acmicpc.net/problem/2230
2230번: 수 고르기
N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어
www.acmicpc.net
2230번
N개의 정수로 이루어진 수열이 있을 때, 이 수열에서 두 수를 골라서 그 차이가 M 이상이면서 제일 작은 경우를 구하여라. (고른 두 수가 같은 수일 수 있다.)
입력으로 첫 줄에 정수의 개수 N과 M이 주어지고 그 다음 N개의 줄에 걸쳐 수열을 이루는 정수가 들어온다.
출력으로 M 이상이면서 가장 작은 차이르르 출력한다.
문제 해결
수열을 정렬한 후 투 포인터로 차이를 구해 문제를 해결한다.
start는 for문을 돌려서 0부터 시작하여 N-1까지 간다.
end 또한 0부터 시작하는데 이는 start 인덱스의 숫자 값과 end 인덱스의 숫자 값의 차이에 따라 변한다.
- 만약 start와 end가 같으면 end에 1을 더한다.
- end < N보다 작고 start 인덱스의 숫자 값과 end 인덱스의 숫자 값의 차이가 M보다 작다면 end에 1을 더한다.
- end가 N이라면 더 이상 M 이상의 차이를 가질 수 있지 않기 때문에 for문을 멈춘다.
- 현재 저장되어있는 answer 값과 start 인덱스의 숫자 값과 end 인덱스의 숫자 값의 차이를 비교하여 더 작은 값을 answer 값으로 업데이트 한다.
- 만약 answer의 값이 N이라면 더 작은 값이 나올 수 없기 때문에 for문을 멈춘다.
코드
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
num = [int(input()) for _ in range(N)]
num = sorted(num)
answer = sys.maxsize
end = 0
for start in range(N):
if start == end:
end += 1
while(end < N and num[end] - num[start] < M):
end+=1
if end == N:
break
answer = min(answer, num[end]-num[start])
if answer == M:
break
print(answer)
결과
answer의 초기 값을 int(1e9)로 하면 틀렸습니다가 뜬다...
그래서 sys.maxsize로 해야 할 수 있다.
728x90
'Algorithm' 카테고리의 다른 글
백준 3273번 <두 수의 합> with 이진탐색 (0) | 2022.05.02 |
---|---|
백준 1940번 <주몽> (0) | 2022.05.02 |
백준 18870번 <좌표 압축> (0) | 2022.05.01 |
백준 7569번 <토마토> (0) | 2022.04.28 |
백준 1926번 <그림> (0) | 2022.04.28 |
댓글