용꿀
꼬마개발자허니
용꿀
전체 방문자
오늘
어제
  • 분류 전체보기 (249) N
    • 개발 (76) N
      • 스프링 입문 (7)
      • 스프링 기본 (9)
      • ToDo List using JPA (2)
      • 스프링 개념 (9)
      • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (8)
      • 스프링 MVC (3)
      • CS (20) N
      • 개발 팁 (8)
      • 스프링 MSA (5)
      • 곰터뷰🐻 (5)
    • 알고리즘 (169)
      • 알고리즘 문제 풀이 (165)
    • 잡동사니 (1)
      • 노래 가사 (1)
hELLO · Designed By 정상우.
용꿀

꼬마개발자허니

[프로그래머스 Lv.3] 징검다리 건너기 (Python)
알고리즘/알고리즘 문제 풀이

[프로그래머스 Lv.3] 징검다리 건너기 (Python)

2024. 7. 3. 01:31

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/64062

 

프로그래머스

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

programmers.co.kr

풀이

문제를 풀기 위한 가장 단순한 방법을 생각해 보면, 단순히 사람이 한 명씩 지나갈 때마다 돌의 밟을 수 있는 횟수를 1 줄이고, 더 이상 밟을 수 없는 돌이 연속적인지 체크하면서 더 이상 지나갈 수 없을 때까지 반복하였을 때 최댓값을 알아내는 방법이다. 하지만 이는 데이터의 수 때문에 불가능하다. 만약 20만 개의 돌을 2억 번까지 밟을 수 있다고 하면 반복문의 수가 20만 * 2억 = 40조 번으로, 파이썬의 1초에 계산할 수 있는 한계인 2천만을 아득히 넘어가게 된다. 그렇기에 n^2의 알고리즘인 단순 체크가 아닌 다른 방법을 생각해야한다.

생각을 바꿔서 특정 수의 사람이 주어진 돌들의 배열인 stones와 k개의 돌을 뛰어넘을 수 있는 상황에서 모두 건널 수 있는지 없는지를 사용해서 이진탐색으로 풀이한다. 만약 특정 수의 사람이 모두 강을 건널 수 있다면 사람의 수를 늘리고, 강을 건너는데 실패한다면 사람의 수를 줄여가며 가장 많은 사람이 건널 수 있는 경우를 찾아낸다.

def solution(stones, k):
    answer = 0
    
    low, high = 0, max(stones)
    
    while low <= high:
        mid = (low + high) // 2
        
        continous_rocks = 0 # 연속되는 돌의 수
        for stone in stones: # 전체 돌을 순회하면서
            if stone < mid: # 현재 위치의 돌이 mid명의 사람이 지나간 후 사라지는 돌이라면
                continous_rocks += 1 # 연속적인지 카운트
            else: # mid명의 사람이 지나간 후에도 남아있는 돌이라면
                continous_rocks = 0 # 연속된 돌의 수 초기화
                
            if continous_rocks >= k: # 연속된 사라진 돌의 수가 k 이상이라면 더 이상 체크할 필요가 없음
                break
        
        if continous_rocks >= k: # 연속된 돌의 수가 k 이상을 넘어서 mid명의 사람이 모두 건너지 못했다면
            high = mid - 1 # 건너는 사람의 수를 줄이기
        else: # mid명의 사람이 모두 건넜다면
            low = mid + 1 # 건너는 사람의 수를 늘리기
            answer = max(answer, mid) # 모든 사람이 건넜다면, answer에 최대값을 갱신
    return answer

'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글

[프로그래머스 Lv.3] 베스트앨범 (Python)  (0) 2024.07.07
[프로그래머스 Lv.2] 오픈채팅방 (Python)  (0) 2024.07.06
[프로그래머스 Lv.4] N으로 표현 (Python)  (0) 2024.07.02
[프로그래머스 Lv.2] 순위 검색 (Python)  (0) 2024.06.15
[프로그래머스 Lv.2] 가장 큰 수 (Python)  (0) 2024.06.13
    '알고리즘/알고리즘 문제 풀이' 카테고리의 다른 글
    • [프로그래머스 Lv.3] 베스트앨범 (Python)
    • [프로그래머스 Lv.2] 오픈채팅방 (Python)
    • [프로그래머스 Lv.4] N으로 표현 (Python)
    • [프로그래머스 Lv.2] 순위 검색 (Python)
    용꿀
    용꿀

    티스토리툴바