Programmers_Summer/Winter Coding(~2018) 기지국 설치(python)
프로그래머스 -기지국 설치 문제 입니다.
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/12979#
2. 분류 및 난이도
Programmers 문제입니다.
Summer/Winter Coding(~2018) 문제입니다.
Level 3난이도의 문제입니다.
3. 생각한 것들(문제 접근 방법)
- brute하게 접근하면 당연히 시간초과가 뜰 것이라고 생각했습니다.(N이 최대 2억까지 들어옴.)
- 결국 최소한으로 기지국을 설치하려면 최대한 넓은 영역에 신호가 미치도록 설치해야하는 것은 맞습니다. 이 부분에서 설치할 기지국은 (남은 영역) / (전파가 영향을 끼치는 영역)으로 구할 수 있습니다.
- 그 영역들은 이전 stations의 +w 그 다음 stations의 -w의 차이가 남은 영역입니다.
- 예제 1에서 stations가[4,11] 으로 (4+1) 과 (11-1)인 5 부터 10까지가 빈 영역입니다.
- 조심해야할 것은 10-5해서 5가 빈 영역이 아닌 10-5-1인 4가 빈 영역입니다. (범위에 10과 5가 둘 다 포함되어 있으므로)
- 마찬가지로 가장 처음 기지국을 설치할 영역과 마지막에 기지국을 설치할 영역을 따로 구해주면 풀 수 있습니다.(배열안에 마지막(N)과 처음(1)이 없으므로)
4. 접근 방법을 적용한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def solution(n, stations, w):
answer = 0
#기지국이 전파를 미치는 영향 예제 1 기준 3 / 2 기준 5
area = w*2 +1
#처음
check = stations[0] - w
# 만약 뺀 값이 범위를 벗어나면 skip을 하고 아니면 계산해줍니다.
if check >1 :
#영역이 1부터 시작하므로 check-1을 해줍니다.
answer += (check -1 ) // area
# 나머지가 있다면 어찌되었든 기지국 1개를 설치해야합니다.
if (check-1) %area != 0 :
answer+=1
#기지국 정보에 따른 값을 수정합니다.
for i in range(len(stations)-1):
#빈 영역 계산 1을 빼주는 이유는 설명에서 말했습니다.
check = (stations[i+1]-w) - (stations[i]+w)-1
#인접하거나 겹치는 경우 skip합니다.
if check <= 0 :
continue
else :
answer += (check) // area
if check %area!=0:
answer+=1
#끝 부분
check = stations[len(stations)-1] + w
#끝의 기지국의 영향이 n을 넘어가면 skip합니다.
if check <n :
answer += (n - check) // area
if (n-check) % area != 0 :
answer +=1
return answer
5. 결과
필요시. c++ 짜드리겠습니다. 설명이 필요시 댓글달아주세요.
This post is licensed under CC BY 4.0 by the author.