Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- codingtest
- DART
- Algorithm
- DFS와BFS
- 안드로이드스튜디오
- DFS
- issue
- django
- 동적계획법과최단거리역추적
- vuejs
- 백준
- AndroidStudio
- 안드로이드
- 코딩테스트
- 코테
- cos
- 파이썬
- android
- Vue
- cos pro 1급
- 동적계획법
- cos pro
- 개발
- C++
- Flutter
- BAEKJOON
- 알고리즘
- 코드품앗이
- 분할정복
- Python
Archives
- Today
- Total
Development Artist
[Baekjoon, Python] 1654번: 랜선 자르기 본문
728x90
반응형
도입
백준 단계별 풀기, 이분탐색 세 번째 문제이다.
풀이
1. K(영식이가 가진 랜선)개의 랜선들 중 가장 높은 값과 가장 낮은 값을 정해서 이분탐색 알고리즘으로 가장 높은 값과 낮은 값의 중간을 설정해가면서 N개를 맞추는 로직이다.
2. 자투리는 버리는 것이기 때문에, //의 산술연산자를 통해 몫만 챙긴다.
3. while문을 돌면서 중간 count로 몇 개의 랜선이 나오는지 확인한다.
4. N(만족해야하는 랜선 수)가 도달하지 않는다면, 길이를 좀 더 줄여봐야 한다. high_l 에 mid_l -1 을 대입해 줄인다.
코드
from sys import stdin
K, N = map(int,stdin.readline().split())
list_K = list(map(int,stdin.readlines()))
high_l, low_l = sum(list_K)//N, 1 # Key point
while low_l <= high_l : # 로우 <= 하이
mid_l = (high_l + low_l)//2 # 중간 값
count = sum([x//mid_l for x in list_K]) # list_K를 mid값으로 나눈 몫 (예제1 -> 4+3+2+2)
if count < N: # N을 못채운 경우
high_l = mid_l - 1
elif count >= N: # N을 채우거나 넘긴경우 (합격)
low_l = mid_l + 1
rtn = mid_l
print(rtn)
마무리
생각보다 할 만한 알고리즘이다. 파이썬으로 알고리즘을 푸는데 있어서 가장 많이 도움을 받고 있는 블로그가 하나 있다. 차밍이님(chancoding) 블로그인데, 알고리즘을 짜더라도 어떻게 효율적으로 짤 수 있는지, 시간복잡도를 더 줄이는 방법등을 많이 배우는 것 같다. 이분탐색부터 해당 블로그를 보고 있는데 정말 도움을 많이 받는 것 같아 구독과 좋아요를 했다!
1. import sys 를 필요한 stdin만 import를 하는 것.
2. input을 통해 입력을 받는 것이 아닌, stdin.readline()으로 받는 것.
등등...
728x90
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon, Python] 2110번 : 공유기 설치 (0) | 2021.02.09 |
---|---|
[Baekjoon, Python] 2805번: 나무 자르기 (0) | 2021.02.08 |
[Baekjoon, Python] 10816번: 숫자 카드 2 (0) | 2021.02.04 |
[Baekjoon, Python] 1920번: 수 찾기 (0) | 2021.02.03 |
[Baekjoon, C++] 6549번: 히스토그램에서 가장 큰 직사각형 (0) | 2021.02.01 |
Comments