상세 컨텐츠

본문 제목

[프로그래머스] 기지국 설치

Algorithm

by 쑤야. 2024. 1. 18. 14:09

본문

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

 

프로그래머스

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

programmers.co.kr

 

접근


  • 예제 1을 기준으로 할 때 커버 가능한 범위가 중요한 것이지, 1번에 기지국을 설치하는지/2번에 기지국을 설치하는지는 중요하지 않다
    → 설치될 인덱스에 집중하지 않아도 된다
  • 현재 설치된 아파트를 기준으로 기지국이 설치되어야 하는 범위들을 나누고, 범위의 길이를 통해 각 범위마다 설치되어야 최소 개수를 더한다 (범위가 2인데 가용 범위가 3일 경우, 1개만 설치되면 되기 때문)

 

로직


  • stations에 대해 반복문을 수행하면서, 현재 설치된 아파트와 가용 범위를 제거한 새로 설치되어야 하는 범위를 구한다
  • 각 범위의 길이(end-start)를 가용 범위 (2*w+1)로 나눈 몫을 answer에 더한다
  • 각 범위의 길이(end-start)를 가용 범위로 (2*w+1)로 나눴을 때 나머지가 0이 아닌 경우에만 answer에 1을 더해준다
    • 3 % 3 == 0, 1개만 설치되어도 된다
    • 4 % 3 == 1, 2개가 설치되어야 한다

코드


1. Swift 풀이


import Foundation

func solution(_ n:Int, _ stations:[Int], _ w:Int) -> Int{
    
    var range = [(Int, Int)]()
    for i in 0..<stations.count {
        var start = 1
        if i > 0 {
            start = stations[i-1] + w + 1
        }
        let end = stations[i] - w - 1
        range.append((start, end))
    }
    if stations.last! != n {
        range.append((stations.last!+w+1,n))
    }

    var answer = 0
    for (s, e) in range {
        answer += (e-s+1) / (2*w+1)
        if (e-s+1) % (2*w+1) > 0 {
            answer += 1
        }
    }
    return answer
}

 

2. Python 풀이


def solution(n, stations, w):
    
    answer = 0
    start = 1
    
    for s in stations:
        
        end = s-w-1
        answer += (end-start+1) // (2*w+1)
        
        if (end-start+1) % (2*w+1) != 0:
            answer += 1
            
        start = s+w+1
    
    if start <= n:
        
        answer += (n-start+1) // (2*w+1)
        
        if (n-start+1) % (2*w+1) != 0:
            answer += 1
    
    return answer

관련글 더보기