RIEN😚
이상한 나라의 개발자
RIEN😚
전체 방문자
오늘
어제
  • 분류 전체보기 (125)
    • Algorithm (68)
      • 알고리즘 (0)
      • Baekjoon (8)
      • 프로그래머스 (55)
      • HackerRank (5)
    • Android (30)
      • Project (1)
      • Error (2)
      • Studio (1)
      • Android (26)
    • Kotlin (6)
    • CS (4)
      • 네트워크 (2)
      • 데이터베이스 (2)
    • Front End (5)
      • React (1)
      • VUE (3)
      • Project (0)
      • 기타 (1)
    • 기록 (11)
      • 회고록 (6)
      • TIL (5)

블로그 메뉴

  • Github🔥
  • 포트폴리오🌹

공지사항

인기 글

티스토리

250x250
반응형
hELLO · Designed By 정상우.
RIEN😚

이상한 나라의 개발자

Algorithm/프로그래머스

[프로그래머스 > Lv4] 징검다리

2023. 3. 6. 14:24
728x90
반응형
 

프로그래머스

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

programmers.co.kr

 

1. 문제

[입력]

출발지점부터 도착지점까지의 거리 distance

바위들이 있는 위치를 담은 배열 rocks

제거할 바위의 수 n

 

[결과]

바위를 n개 제거한 뒤 각 지점 사이의 거리의 최솟값 중에 가장 큰 값을 return

 

2. 풀이

문제의 카테고리에서 알 수 있듯이 이분탐색을 이용해 풀 수 있는 문제입니다.

 

시작점은 0, 끝점은 distance로 두고 중간값 mid는 바위들 사이의 최대 거리를 의미한다고 합시다.

그럼 이분 탐색의 범위를 정하는 조건은 무엇일까요? 🤔

 

이 때, 입력값으로 주어진 제거할 바위의 수 n을 사용할 수 있습니다.

바위들 사이에 가능한 최대 거리가 mid이기 때문에 mid가 될때까지 그 중간 바위들은 제거할 수 있음을 알 수 있습니다.

 

그리고 이렇게 제거된 바위의 개수가 n보다 클 경우에는 제거될 수 있는 바위의 개수를 줄여야 하기 때문에

이분 탐색의 범위를 왼쪽(left ~ mid-1)으로 나누며, 그러지 않을 경우에는 오른쪽(mid+1 ~ right)으로 나누어줄 수 있습니다.

 

이를 코드로 간략히 나타내면 아래와 같습니다. 👇🏻

left, right = 0, distance
while left < right:
	mid = (left+right)//2
    skip = // 제거될 수 있는 바위의 개수
    if skip > n:
    	right = mid
    else:
    	left = mid+1

 

이제는 제거될 수 있는 바위의 개수를 구해야 합니다.

각 바위 사이의 거리들을 합하면서 건너뛸 수 있는 바위의 개수를 구해보도록 하겠습니다.

 

바위 사이의 거리를 이용해야 하기 때문에 먼저 rocks 배열을 이용해 새로운 배열을 만들어주도록 하겠습니다.

🌹 이때, 시작점은 0, 끝점은 distance여야 한다는 사실에 유의해주세요.
 rocks.sort()
diff = []
for i in range(1,len(rocks)):
    diff.append(rocks[i]-rocks[i-1])
diff = [rocks[0]] + diff + [distance-rocks[-1]]

 

제거될 바위의 개수를 구하는 코드는 아래와 같습니다.

def countSkip(diff, mid):
    cur, skip = 0, 0
    for d in diff:
        cur += d
        if cur > mid: cur = 0
        else: skip+=1
    return skip​

 

3. 코드

Python
def solution(distance, rocks, n):
    rocks.sort()
    diff = []
    for i in range(1,len(rocks)):
        diff.append(rocks[i]-rocks[i-1])
    diff = [rocks[0]] + diff + [distance-rocks[-1]]
    left, right = 0, distance
    
    while left < right:
        # 각 지점간의 최소 거리
        mid = (left+right)//2
        skip = countSkip(diff, mid)
        if skip > n: right = mid
        else: left = mid+1
            
    return left

def countSkip(diff, mid):
    cur, skip = 0, 0
    for d in diff:
        cur += d
        if cur > mid: cur = 0
        else: skip+=1
    return skip

 

반응형

'Algorithm > 프로그래머스' 카테고리의 다른 글

[프로그래머스 > Lv4] 동굴탐험  (0) 2023.03.11
[프로그래머스 > Lv4] 블록 게임  (0) 2023.03.07
[프로그래머스 > Lv3] 연속 펄스 부분 수열의 합  (0) 2023.03.05
[프로그래머스 > Lv1] 바탕화면 정리  (0) 2023.03.04
[프로그래머스 > Lv1] 대충 만든 자판  (0) 2023.03.04
    'Algorithm/프로그래머스' 카테고리의 다른 글
    • [프로그래머스 > Lv4] 동굴탐험
    • [프로그래머스 > Lv4] 블록 게임
    • [프로그래머스 > Lv3] 연속 펄스 부분 수열의 합
    • [프로그래머스 > Lv1] 바탕화면 정리
    RIEN😚
    RIEN😚
    안드로이드 / 코틀린 독학으로 취업하자!

    티스토리툴바