[Python] BOJ / 3020번 / 개똥벌레

2022. 6. 28. 11:10·🥇 Problem Solving/Binary Search
 

3020번: 개똥벌레

개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이

www.acmicpc.net


📝 풀이

  • 장애물(석순과 종유석)로 가득찬 동굴을 개똥벌레가 통과하고자 할 때, 개똥벌레가 파괴해야 하는 장애물의 최솟값과 그러한 구간의 총 개수를 구하는 프로그램
  • 이분 탐색 알고리즘을 통해 각각의 장애물(석순과 종유석)과 높이에 따라 파괴해야 하는 장애물의 첫 번째 인덱스를 구한 뒤 해당 인덱스를 통해 파괴해야 하는 장애물의 수를 구할 수 있음
    • 석순(down)을 파괴하는 경우는 개똥벌레가 날아가는 높이(target)를 (i - 0.5)로 설정하여 구할 수 있으며 종유석(up)을 파괴하는 경우는 높이를 (h - i + 0.5)로 설정하여 구할 수 있음
      • 첫 번째 구간은 높이 0과 1 사이인 0.5, 두 번째 구간은 높이 1과 2 사이인 1.5, 세 번째 구간은 높이 2와 3 사이인 2.5를 지나게 되므로
    • 위 과정에서 구한 파괴해야 하는 장애물의 수(total_cnt)가 현재까지 구한 최솟값(obs_cnt)과 같다면 구간의 개수(sec_cnt)를 증가시켜줌. 만약 파괴해야 하는 장애물의 수가 현재까지 구한 최솟값보다 작다면 최솟값을 갱신시켜주고 구간의 개수를 1로 초기화

💻 소스코드

import sys

input = sys.stdin.readline

def binary_search(arr, target):
    left, right = 0, len(arr) - 1

    while left <= right:
        mid = (left + right) // 2
        if arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    
    return left

n, h = map(int, input().split())

up, down = [], []
for i in range(n):
    if i % 2 == 0:
        up.append(int(input()))
    else:
        down.append(int(input()))

up.sort()
down.sort()

obs_cnt, sec_cnt = n, 0
for i in range(1, h + 1):
    up_cnt = len(up) - binary_search(up, h - i + 0.5)
    down_cnt = len(down) - binary_search(down, i - 0.5)
    total_cnt = up_cnt + down_cnt

    if obs_cnt == total_cnt:
        sec_cnt += 1
    elif obs_cnt > total_cnt:
        obs_cnt = total_cnt
        sec_cnt = 1

print(obs_cnt, sec_cnt)
저작자표시 (새창열림)

'🥇 Problem Solving > Binary Search' 카테고리의 다른 글

[Python] BOJ / 12738번 / 가장 긴 증가하는 부분 수열 3  (0) 2022.06.03
[Python] BOJ / 1939번 / 중량제한  (0) 2022.05.24
[Python] BOJ / 2470번 / 두 용액  (0) 2022.05.07
[Python] BOJ / 12015번 / 가장 긴 증가하는 부분 수열 2  (0) 2022.04.24
[Python] BOJ / 2110번 / 공유기 설치  (0) 2022.04.11
'🥇 Problem Solving/Binary Search' 카테고리의 다른 글
  • [Python] BOJ / 12738번 / 가장 긴 증가하는 부분 수열 3
  • [Python] BOJ / 1939번 / 중량제한
  • [Python] BOJ / 2470번 / 두 용액
  • [Python] BOJ / 12015번 / 가장 긴 증가하는 부분 수열 2
Baeg-won
Baeg-won
  • Baeg-won
    좋았다면 추억이고 나빴다면 경험이다.
    Baeg-won
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 🍃 Spring, Spring Boot
        • 스프링 프레임워크 기초
        • 스프링 핵심 원리 - 기본편
        • 자바 ORM 표준 JPA 프로그래밍 - 기본편
        • 스프링 MVC
        • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
      • 🥑 Web Technoloy
      • 🚗 Backend Toy Project
        • 스프링 부트 게시판
        • Photogram
        • Baeg-won Clothing Gallery
      • 🥇 Problem Solving
        • Breadth-First Search
        • Depth-First Search
        • Backtracking
        • Simulation
        • Two-pointer
        • Binary Search
        • Greedy
        • Dynamic Programming
        • Minimum Spanning Tree
        • Dijkstra
        • Floyd warshall
      • ☕ Java
        • 명품 자바 에센셜
        • Applications
      • 🍦 JavaScript
        • JavaScript 기초
      • 🐧 Linux
        • 이것이 리눅스다(CentOS 8)
      • 📟 Database
        • 혼자 공부하는 SQL
      • 🧬 Data Structure
      • 🎬 HTML
      • 🎤 Tech Interview
      • 📌 etc
        • Unity 2D Raising Jelly Game
        • C++
        • 영어 쉐도잉
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Baeg-won
[Python] BOJ / 3020번 / 개똥벌레
상단으로

티스토리툴바