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)
'🧩 Programming Languages > Python CodingTest' 카테고리의 다른 글
백준 1929번(silver 3) : 소수 구하기 (1) | 2024.01.28 |
---|---|
백준 4134번(silver 4) : 다음 소수 (소수 판명:에라토스테네스의 체) (1) | 2024.01.26 |
백준 1735번(silver 3) : 분수 합 (0) | 2024.01.26 |
백준 1934번(bronze 1) : 최소공배수 (math 라이브러리 활용) (0) | 2024.01.26 |
백준 11478번(silver 4) : 서로 다른 부분 문자열의 개수 (인덱싱, set 선언) (0) | 2024.01.23 |