728x90
https://school.programmers.co.kr/learn/courses/30/lessons/12979
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🤔 문제분석
처음에 문제를 접했을때 아래와 같은 방식으로 방법을 정하여 문제를 해결하였습니다.
- 주어진 위치를 기준으로 기지국의 범위를 정한다.
- 전파가 되지 않는 도시의 구간을 모두 구한다.
- 도시의 구간의 길이를 구하여 기지국을 설치할 최소 수를 카운팅 한다.
- 설치할 최소 수 = 올림(도시의 길이 / w*2 + 1)
💻 코드
from math import ceil
def solution(n, stations, w):
def make(city):
return [max(0, city - w), min(city + w, n)]
# 해당위치를 기준으로 기지국의 범위를 지정한다.
temp = [[0, 0]] + list(map(make, stations)) + [[n+1, n+1]]
n = len(temp)
# 도시의 구간을 나눈다.
city_range = set()
# 겹치는 부분을 제거 해가면서 도시의 구간을 나누어본다.
for i in range(1, n-1):
if temp[i-1][1] < temp[i][0]:
city_range.add((temp[i-1][1] + 1, temp[i][0] - 1))
if temp[i+1][0] > temp[i][1]:
city_range.add((temp[i][1] + 1, temp[i+1][0] - 1))
answer = 0
# 도시의 구간을 길이를 구하여 기지국을 설치할 최소 수를카운팅 한다.
for r in city_range:
length = r[1] - r[0] + 1
answer += ceil(length / (1 + w*2))
return answer
다른 사람의 풀이를 참조하였는데 저처럼 구간을 필터링 하지않고 주어진 조건 그대로 문제를 해결하여서 똑같이 구현 해보았습니다. 문제를 푸는 원리는 똑같으나 훨씬 간결합니다.
import math
def solution(n, stations, w):
answer, start = 0, 1
# 전파가 안되는 마을의 구간을 구한다.
for cur in stations:
length = cur - w - start
answer += math.ceil(length / (w*2 + 1))
start = cur + w + 1
# 끝까지 안닿았을경우 갱신해준다.
if n >= start:
length = n + 1 - start
answer += math.ceil(length / (w * 2 + 1))
return answer
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 트리 트리오 중간값 (0) | 2024.05.11 |
---|---|
[프로그래머스] 삼각달팽이 (0) | 2024.05.11 |
[프로그래머스] 스티커 모으기2 (0) | 2024.05.01 |
[프로그래머스] 멀쩡한 사각형 (1) | 2024.05.01 |
[프로그래머스] 지형편집 (1) | 2024.05.01 |