CS/알고리즘 문제 풀이

[백준] 3020 - 개똥벌레 [Python(파이썬)]

2021. 7. 19. 18:22
목차
  1. 문제
  2. 풀이
  3. 코드

문제

https://www.acmicpc.net/problem/3020

 

3020번: 개똥벌레

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

www.acmicpc.net

 

풀이

석순과 종유석을 별도의 리스트에 담아 정렬한 후, 이진 탐색을 진행하면 얼마나 많은 장애물을 파괴해야 하는지 구할 수 있다. 이때, bisect 모듈을 사용하면 좀 더 간결하게 코드를 짤 수 있다. 해당 함수들은 리스트에서 특정 값이 삽입될 인덱스를 반환한다.

bisect_left(arr, value)
bisect_right(arr, value)
 

bisect — 배열 이진 분할 알고리즘 — Python 3.9.6 문서

bisect — 배열 이진 분할 알고리즘 소스 코드: Lib/bisect.py 이 모듈은 정렬된 리스트를 삽입 후에 다시 정렬할 필요 없도록 관리할 수 있도록 지원합니다. 값비싼 비교 연산이 포함된 항목의 긴 리

docs.python.org

 

 

리스트 원소의 수(n//2)에서 반환된 인덱스를 빼주면 파괴해야 할 장애물을 구할 수 있다. 이를 코드로 표현하면 다음과 같다. 여기서 종유석(tops)의 경우엔 값을 변환해줘야 한다. 나는 간단하게 상하를 뒤집는 방식으로 생각했는데, 직접 숫자를 넣어보면 금방 이해될 것이다.

top_idx, bot_idx = bisect_left(tops, (t+1)-h), bisect_left(bottoms, h)
obs_cnt = n - (top_idx+bot_idx)    # (n//2 - top_idx) + (n//2 - bot_idx)

 

이와 같이 매 높이(h)마다 이분 탐색을 진행하면서 최솟값을 갱신해주면 답을 구할 수 있다.

 

 

코드

import sys
from bisect import bisect_left

def search():
    min_value = float('inf')
    cnt = 1
    for h in range(1, t+1):
        top_idx, bot_idx = bisect_left(tops, (t+1)-h), bisect_left(bottoms, h)
        obs_cnt = n - (top_idx+bot_idx)
        if obs_cnt < min_value:
            min_value = obs_cnt
            cnt = 1
        elif obs_cnt == min_value:
            cnt += 1
    return min_value, cnt


n, t = map(int, sys.stdin.readline().split())
tops, bottoms = [], []

for i in range(n):
    height = int(sys.stdin.readline().strip())
    if i % 2 == 0:
        bottoms.append(height)
    else:
        tops.append(height)

tops.sort()
bottoms.sort()

print(*search())
저작자표시 비영리 (새창열림)

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

[프로그래머스] 로또의 최고 순위와 최저 순위 [Python(파이썬), Java(자바)]  (0) 2021.09.14
[백준] 1939 - 중량제한 [Python(파이썬)]  (0) 2021.07.19
[백준] 18234 - 당근 훔쳐 먹기 [Python(파이썬)]  (0) 2021.07.19
[프로그래머스] 크레인 인형뽑기 게임 [Java(자바)]  (0) 2021.07.15
[백준] 11497 - 통나무 건너뛰기 [Python(파이썬)]  (2) 2021.07.02
  1. 문제
  2. 풀이
  3. 코드
'CS/알고리즘 문제 풀이' 카테고리의 다른 글
  • [프로그래머스] 로또의 최고 순위와 최저 순위 [Python(파이썬), Java(자바)]
  • [백준] 1939 - 중량제한 [Python(파이썬)]
  • [백준] 18234 - 당근 훔쳐 먹기 [Python(파이썬)]
  • [프로그래머스] 크레인 인형뽑기 게임 [Java(자바)]
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • dp
  • http
  • atdd
  • 그래프
  • 깊이 우선 탐색
  • mysql
  • Git
  • 그래프 탐색
  • fastapi
  • BOJ
  • 백준
  • 브루트포스
  • Shortest Path
  • 장고
  • 파이썬

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[백준] 3020 - 개똥벌레 [Python(파이썬)]
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.