본문 바로가기

알고리즘/백준

[백준] 1911번 : 흙길 보수하기

728x90

1911번: 흙길 보수하기

 

1911번: 흙길 보수하기

어젯밤 겨울 캠프 장소에서 월드 본원까지 이어지는, 흙으로 된 비밀길 위에 폭우가 내려서 N(1 ≤ N ≤ 10,000)개의 물웅덩이가 생겼다. 월드학원은 물웅덩이를 덮을 수 있는 길이가 L(1 ≤ L ≤ 1,000

www.acmicpc.net

🤔 문제분석

오름차순으로 정렬한뒤, 위치를 가르키는 임의의 변수를 활용하여 문제를 해결하였습니다. 여기서 포인트는 임의의 위치의 변수를 start가 더 클경우 pos를 start로 초기화 시켜줍니다. pos가 end에 도달 할때까지 개수를 증가시키며 pos에 L을 더합니다.

💻 코드

import sys
input = sys.stdin.readline

N, L = map(int, input().split())

water = []
for _ in range(N):
    water.append(tuple(map(int, input().split())))

water.sort()

pos = 0
cnt = 0
for start, end in water:
    if start > pos:
        pos = start
    
    while end > pos:
        pos += L
        cnt += 1

print(cnt)

🎯 피드백 및 개선사항

수학적인 개념을 활용하여 시간복잡도를 줄일 수 있습니다. 나머지 연산을 활용하여 L로 얼마나 나눌 수 있는지 개수를 카운팅하고 나머지가 1보다 크다면 하나더 증가시켜 주어야합니다.

from sys import stdin
input = stdin.readline
n, l = map(int, input().split())
p = []
for i in range(n):
    p.append(list(map(int, input().split())))
p.sort(key=lambda x: x[0])
last = p[0][0]
cnt = 0
for i in range(n):
    if last < p[i][0]:
        last = p[i][0]
    ccnt = (p[i][1] - last) // l
    if (p[i][1] - last) % l != 0:
        ccnt += 1
    # print(p[i][0], p[i][1], last, ccnt, cnt)
    last += ccnt * l
    cnt += ccnt
    
print(cnt)
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1374번 : 강의실  (0) 2024.02.16
[백준] 1083번 : 소트  (0) 2024.02.16
[백준] 13334번 : 철로  (0) 2024.02.15
[백준] 13164번 : 행복 유치원  (0) 2024.02.14
[백준] 8983번 : 사냥꾼  (0) 2024.02.14