주니어 데이터 엔지니어 우솨's 개발일지

코딩 테스트(Python) 2019 카카오 개발자 겨울 인턴십 징검다리 건너기 본문

코딩 테스트

코딩 테스트(Python) 2019 카카오 개발자 겨울 인턴십 징검다리 건너기

우솨 2024. 12. 17. 03:29

문제 설명

[본 문제는 정확성과 효율성 테스트 각각 점수가 있는 문제입니다.]

카카오 초등학교의 "니니즈 친구들"이 "라이언" 선생님과 함께 가을 소풍을 가는 중에 징검다리가 있는 개울을 만나서 건너편으로 건너려고 합니다. "라이언" 선생님은 "니니즈 친구들"이 무사히 징검다리를 건널 수 있도록 다음과 같이 규칙을 만들었습니다.

  • 징검다리는 일렬로 놓여 있고 각 징검다리의 디딤돌에는 모두 숫자가 적혀 있으며 디딤돌의 숫자는 한 번 밟을 때마다 1씩 줄어듭니다.
  • 디딤돌의 숫자가 0이 되면 더 이상 밟을 수 없으며 이때는 그 다음 디딤돌로 한번에 여러 칸을 건너 뛸 수 있습니다.
  • 단, 다음으로 밟을 수 있는 디딤돌이 여러 개인 경우 무조건 가장 가까운 디딤돌로만 건너뛸 수 있습니다.

"니니즈 친구들"은 개울의 왼쪽에 있으며, 개울의 오른쪽 건너편에 도착해야 징검다리를 건넌 것으로 인정합니다.

"니니즈 친구들"은 한 번에 한 명씩 징검다리를 건너야 하며, 한 친구가 징검다리를 모두 건넌 후에 그 다음 친구가 건너기 시작합니다.

디딤돌에 적힌 숫자가 순서대로 담긴 배열 stones와 한 번에 건너뛸 수 있는 디딤돌의 최대 칸수 k가 매개변수로 주어질 때, 최대 몇 명까지 징검다리를 건널 수 있는지 return 하도록 solution 함수를 완성해주세요.

 

 

첫 번째 친구는 다음과 같이 징검다리를 건널 수 있습니다.

첫 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다.

두 번째 친구도 아래 그림과 같이 징검다리를 건널 수 있습니다.

두 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다.

세 번째 친구도 아래 그림과 같이 징검다리를 건널 수 있습니다.

세 번째 친구가 징검다리를 건넌 후 디딤돌에 적힌 숫자는 아래 그림과 같습니다.

네 번째 친구가 징검다리를 건너려면, 세 번째 디딤돌에서 일곱 번째 디딤돌로 네 칸을 건너뛰어야 합니다. 하지만 k = 3 이므로 건너뛸 수 없습니다.

따라서 최대 3명이 디딤돌을 모두 건널 수 있습니다.

 

 

def solution(stones, k):
    answer = 0
    # 시작점은 1, 끝점은 stones 배열에서 가장 큰 값으로 설정
    start, end = 1, max(stones)
    
    # 이진 탐색으로 최소값을 찾기 위해 start가 end보다 작거나 같은 동안 반복
    while start <= end :
        mid = (start + end) // 2  # 중간값을 계산
        cnt = 0  # 연속된 0의 개수 초기화
        
        # stones 배열을 순회하며 연속된 0의 개수 계산
        for s in stones :
            if (s - mid) <= 0 :  # 현재 값에서 mid를 뺀 값이 0 이하일 경우
                cnt += 1  # 연속된 0을 카운트
                if cnt >= k :  # 연속된 0의 개수가 k 이상이면
                    break
            else :
                cnt = 0  # 연속된 0이 아니면 카운트 초기화
                
        # 연속된 0이 k개 이상이면 mid 값을 줄여서 다시 시도
        if cnt >= k :
            end = mid - 1
        else :
            # 연속된 0이 k개 미만이면 mid 값을 늘려서 다시 시도
            start = mid + 1
            answer = start  # 현재 값이 최소값이므로 answer를 갱신
    
    return answer  # 최소값 반환