본문 바로가기

알고리즘/백준

백준 2485 - 가로수

문제


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

 

 

 

풀이


# 백준/실버4/가로수

# 유클리드 호제법
# a,b가 있을 때, a를 b로 나눈값을 b, 기존의 b를 a로 바꾸면서
# b가 0이 될때까지 반복한다.

def gcd(a,b):
    while b > 0:
        a,b = b,a % b
    
    return a

n = int(input())

data = []

# 입력값
for _ in range(n):
    data.append(int(input()))

# 가로수 사이의 격차를 저장
diff = []

for i in range(1,len(data)):
    diff.append(data[i] - data[i-1])

# 격차 간의 최대공약수를 구한다
g = diff[0]
for j in range(1,len(diff)):
    g = gcd(g, diff[j])

# 가로수 개수를 세는 변수
cnt = 0

# 가로수 값은 격차 // 전체 격차의 최대공약수 - 1

# if 3 9 13
# diff = 6,4
# gcd = 2
# 3 (5,7) 9 (11) 13 이므로
# 6 // 3 -1 = 2 때문에 3과 9사이에 2개의 가로수가 세워진다.
for k in diff:
    cnt += k // g - 1

print(cnt)

 

그냥 구현했더니 시간초과

 

개인적으로는 두 지점에서 이해가 잘 안갔다

 

1. 왜 최대공약수를 사용하며, 모든 간격간에 적용하는가?

 

2. 왜 cnt += k // g - 1에서 -1을 적용할까?

 

 

내가 생각한 답은

1. 문제는 최소한의 개수로 가로수를 세워야한다.

   모든 가로수를 일정 간격으로 세우기 위해서는 최대공약수만큼의 차이만 가능하다.  

   ex. 간격이 1,7,3이면 최대공약수인 1로 설정해야 함

   1과7의 최대 공약수는 1, 이 최대공약수와 3을 비교하면 1이 나온다. 그냥 (1*2)*3, 1*(2*3)의 결과가 같은 것과 같은 원리     라고 이해함.

 

2. 나는 가로수를 한 지점에 채우는 것으로 생각함 근데 -1을 안해주는 것은 그냥 그 면적을 채울때는 맞는데 가로수 하나가

세워질때는 -1을 적용해야함. 

 

약간 이런 느낌으로 간격 2로 앞뒤 2개의 간격을 채우니까 -1을 적용하여 하나의 가로수가 필요한 것

 

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

백준 1920 - 수 찾기  (0) 2024.05.28
백준 11651 - 좌표 정렬하기 2  (0) 2024.05.27
백준 1246 - 온라인 판매  (1) 2024.05.23
백준 16439 - 치킨치킨치킨  (0) 2024.05.22
백준 1268 - 임시 반장 정하기  (0) 2024.05.21