코딩테스트/그리디

기지국 설치

수타. 2023. 7. 3. 19:58

https://school.programmers.co.kr/learn/courses/30/lessons/12979

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제설명:

n개의 배열이 있고 서있는곳부터 -w,+w까지 전파가 닿는 기지국이 주어진다. 전체 전파를 닿게하기위해 추가적으로 기지국을 설치할때 기지국의 최소치를 구하시오

 

소요시간:

30분

난이도3

 

코딩:

def solution(n, stations, w):
	# k-w ~ k ~ k+w
	piv = 0
	ans = 0
	for k in stations:
		#설치되어있는 기지국 전까지 최소한으로설치하기 
		ans += (k-1-w-piv)//(2*w+1)
		if (k-1-w-piv)%(2*w+1):
			ans+=1
		#그 기치국의 오른쪽끝
		piv = k+w
	else:
		#마지막 으로부터 남은곳까지 최소한으로 설치하기
		ans += (n-piv)//(2*w+1)
		if (n-piv)%(2*w+1):
			ans+=1
	return ans

 

문제설명은 예시를 든다면, k가 가령 9이고 w가 2일때 한기지국이 커버할수 있는 길이는 2*w+1 즉 5가 됩니다.

그렇다면 9에 있는 기지국은 7까지 커버가 가능하고, 1부터 6까지에 기지국을 설치해야 함으로, 6을 5로 나눈뒤 나머지가 있다면 추가적으로 +1을 해준것 입니다. 그후 그 9에 있는 기지국은 11까지 커버가 가능하기 때문에 다음 시작지점은 12부터 시작합니다.

또한 마지막에 설치되어있는 기지국에대한 계산이 끝나면 , 마지막 기지국의 영향이 끝나는 지점부터 끝까지 같은 메커니즘으로 반복해줍니다. 

 

다른사람 풀이:

import math
def solution(n, stations, w):
    answer, start = 0, 1
    for c in stations:
        answer += math.ceil(((c - w) - start)/(2 * w + 1))
        start = c + w + 1
    answer += math.ceil((n + 1 - start)/(2 * w + 1))
    return answer

원리는 똑같지만 math.ceil함수를 사용해, 딱떨어지지않는다면 +1이 되는 것을 깔끔하게 구현하였습니다.