본문 바로가기
카테고리 없음

[BOJ] 2485. 가로수(Python)

by chesleashin 2021. 3. 4.

www.acmicpc.net/problem/2485

 

2485번: 가로수

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

www.acmicpc.net

  • gcd(Greatest Common Devisor) 최대공약수 구하는 함수 이용해서 148ms로 시간 단축 => 통과

 

파이썬 코드는 다음과 같다.


import sys
input = sys.stdin.readline
from math import gcd

n = int(input())
trees = []
gaps = []
for i in range(n):
    trees.append(int(input()))
    if i > 0:
        gaps.append(trees[i] - trees[i-1])

# 최대공약수 구하는 gcd 함수 이용
max_gap = gcd(gaps[0], gaps[1])
for i in range(1, n-1):
    max_gap = gcd(max_gap, gaps[i])     # 최대공약수 갱신

# 두 나무 사이 가장 긴 거리를 간격으로 나눈 몫 + 1이 전체 나무 수.
# 놓을 수 있는 전체 나무 수 - 주어진 나무 수 n을 빼주면 심어야하는 나무 수!
print((trees[-1]-trees[0]) // max_gap + 1 - n)

사실 이 전에 시도했던 O(N^2)의 효율성 꽝으로 풀었던 코드(이 코드도 통과 받긴 했다ㅋㅋ)

파이써닉하게 쓰라고 주어진 함수는 편하게 쓰라고 있는거다.. 적극 이용하자 gcd(최대공약수)!!


 

# 시간 1400ms의 효율성 꽝 코드..

n = int(input())
trees = []
gaps = []
for i in range(n):
    trees.append(int(input()))
    if i > 0:
        gaps.append(trees[i] - trees[i-1])
        
max_gap = 1
for k in range(2, min(gaps)+1):
    flag = True
    for gap in gaps:
        if gap % k:
            flag = False
            break
    if flag:
        max_gap = max(max_gap, k)

print((trees[-1] - trees[0]) // max_gap + 1 - n)

* 고찰 : 메서드는 이용하라고 있는거다. 괜히 안 쓰다가 엄청난 시간 폭격을 맞게 될 수 있다.. 푸는 데 30분 정도 소요.