본문 바로가기

코딩테스트 준비/[백준]

[백준] 1449번 - 수리공 항승 (파이썬)

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

 

1449번: 수리공 항승

첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 L이 주어진다. 둘째 줄에는 물이 새는 곳의 위치가 주어진다. N과 L은 1,000보다 작거나 같은 자연수이고, 물이 새는 곳의 위치는 1,000보다 작거나

www.acmicpc.net

[코드]

N, L = map(int, input().split())
leak_points = list(map(int, input().split()))
leak_points.sort()
tape_cover_start_point = 0
used_tape_num = 0

tape_cover_start_point = leak_points[0] - 0.5
used_tape_num += 1
for i in range(1, N):

    if tape_cover_start_point + L < leak_points[i] + 0.5:
        used_tape_num += 1
        if tape_cover_start_point + L == leak_points[i]:
            tape_cover_start_point = leak_points[i]
        else:
            tape_cover_start_point = leak_points[i] - 0.5

print(used_tape_num)

 

[주의사항]

분명히 알고리즘이 완벽히 맞다고 생각했는데 계속 틀려서 포기하다가 리스트 sort() 를 넣었더니 맞았다

둘째줄의 물이 새는 위치는 당연히 예시값에 주어진대로 작은수부터 주어질줄 알았으나 그렇지 않았다.

input 값이 제대로 주어지는지 주의하자 

 

[아이디어]

일단 첫번재 누수 포인트에 테이프를 붙이고 누수 포인트로부터 + L 까지가 그다음 누수포인트를 제대로 덮는지 체크한다

덮으면 그 다음 누수포인트를 체크하고 덮지 못하면 테이프를 하나더 쓰되, 테이프를 이어서 붙일수 있으면 이어서 붙이고 그렇지 않으면 누수포인트 - 0.5 지점부터 붙인다.