강의로 돌아가기
injae Kim

[힌트] 문제 풀이 접근 방법

문제 접근 방법은 다음과 같습니다.

  1. 우선 전파가 닿지 않는 구간들을 구한다.
  2. 위에서 구한 구간에서, 각 구간의 길이에 따라서 설치해야 하는 안테나의 개수를 구한다
    1. 1 각 구간의 길이에 따라서, 설치해야 하는 안테나의 개수는 바로 구할 수 있다
    2. 2 한대의 안테나가 커버할 수 있는 범위는 1 + 2w 이다. 자신이 설치된 칸(1) + 양옆으로 w 범위(2w) 이기 때문이다.
    3. 3 따라서, 각 구간의 길이를 1 + 2*w 로 나눈 값을 올림 해준 결과가 각 구간에 설치해야 하는 최소 안테나 개수 이다.
    4. 4 올림을 하는 이유는. 안테나가 2.3개 처럼 소숫점으로 존재할 수 는 없기 때문이다.

각 구간에서 필요한 최소 안테나 설치 개수는 그리디 알고리즘으로도 구할 수 있습니다!

import math

def solution(n, stations, w):
    answer = 0

    # 전파가 안통하는 구간의 (시작점, 끝점) 의 모음
    segments = []


    # 좌표1 ~ 첫번째 안테나 사이의 전파가 안통하는 구간
    if stations[0] - w - 1 >= 1:
        segments.append([1, stations[0]-w-1])

    # 첫번째 안테나 ~ 마지막 안테나 사이의 전파가 안통하는 구간
    for i in range(len(stations) - 1):
        start = stations[i] + w + 1
        end = stations[i+1] - w - 1

        if start <= end:
            segments.append([start, end])

    # 마지막 안테나 ~ 좌표n 까지 전파가 안통하는 구간
    if stations[-1] + w + 1 <= n:
        segments.append([stations[-1] + w + 1, n])

    # 전파가 안통하는 구간 마다
    for segment in segments:
        # 구간의 길이
        length = segment[1] - segment[0] + 1

        # 구간의 길이가 1대의 안테나 설치로 커버 가능한 경우
        if length <= w*2 + 1:
            answer += 1
        # 구간의 길이를 커버할 수 있는 만큼의 안테나 설치
        # 한대의 안테나가 커버할 수 있는 너비는 1 + w*2
        # -> 안테나의설치위치 + 양옆으로 w 만큼 = 1 + w*2
        # 안테나의 개수는 소수점이 나올수 없으므로, 올림처리
        else:
            answer += math.ceil(length / (w*2 + 1))


    return answer
  • 고맙습니다!

    탈퇴한 사용자―2021.05.04 23:26
0 개의 답변
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.