🧩 Programming Languages/Python CodingTest

백준 2485번(silver 4) : 가로수 - 최대공약수

복숭아아이스티에샷추가 2024. 1. 26. 19:00
 

2485번: 가로수

첫째 줄에는 이미 심어져 있는 가로수의 수를 나타내는 하나의 정수 N이 주어진다(3 ≤ N ≤ 100,000). 둘째 줄부터 N개의 줄에는 각 줄마다 심어져 있는 가로수의 위치가 양의 정수로 주어지며, 가

www.acmicpc.net


 

 내가 작성한 코드 - 메모리 초과 

import sys
import math

input = sys.stdin.readline

n = int(input().rstrip())
tree = [int(input().rstrip()) for _ in range(n)]

# 심어진 나무들의 간격을 구하기
interval = []
for i in range(0, n-1):
    interval.append(tree[i+1]-tree[i])

# 간격들의 최대공약수 구하기
gcd = interval[0]
for j in range(1, len(interval)):
    gcd = math.gcd(gcd, interval[j])

# 심어야할 나무 위치 구하기
check = tree[0] + gcd
plant = []
for k in range(1, n):
    while tree[k] >= check :
        if tree[k] != check: # 만약 심어져 있어야할 위치에 나무가 없다면
            plant.append(check) # 그 위치 저장
        check += gcd # 다음 간격으로

# 심어야할 나무 개수 출력하기
print(len(plant))

 

처음에 어떻게 풀어야할지 몰라서 간격의 최대공약수를 구하면 된다는 것만 찾아보고 코드를 작성해보았는데 메모리 초과가 떴다.

그래서 풀이를 찾아보았다.

 

 

 심어야할 나무 구하고 출력하는 부분만 수정 

# 심어야할 나무 위치 구하기
plant = 0
for tree in interval:
    plant += tree // gcd - 1 # 최대공약수에는 1이 포함되므로 1을 뺴줘야한다.

# 심어야할 나무 개수 출력하기
print(plant)