일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 기억장치
- 시스템 소프트웨어
- 컴퓨터 동작방식
- ARP
- 컴퓨터네트워크
- GIT
- 라우팅
- 이것이 취업을 위한 코딩테스트다
- 자료형
- 이코테
- 쿠키
- 노개북
- 이것이 취업을 위한 코딩 테스트다
- 데이터통신
- data type
- OSI7계층모델
- RARP
- 데이터 통신과 컴퓨터 네트워크
- icmp
- IT5분잡학사전
- 파이썬 자료형
- CS
- sort()
- 파이썬 정렬
- DP
- 쉽게 배우는 데이터 통신과 컴퓨터 네트워크
- 노마드코더
- 북클럽
- 파이썬 연산자
- 리스트
Archives
- Today
- Total
뚝딱햄 탈출기
[Python][백준 BOJ Bronze I] 2869. 달팽이는 올라가고 싶다 : 반복문으로 인한 시간 초과 해결 본문
Algorithm & Data structure/알고리즘 문제 풀이
[Python][백준 BOJ Bronze I] 2869. 달팽이는 올라가고 싶다 : 반복문으로 인한 시간 초과 해결
hyrmzz1 2023. 12. 5. 17:07
❌ 접근 방식 1
낮과 밤에 각각 +2, -1만큼의 높이를 올라간다.
따라서 날짜를 처음에 카운트 하고 낮과 밤에 움직일 수 있는 높이를 각각 계산한 후,
높이가 V 이상이 되는 즉시 while문을 종료한 후 날짜를 출력한다.
import sys
a, b, v = map(int, sys.stdin.readline().split())
days = 0
h = 0
while True: # h == v 일 때까지 무한루프
days += 1
h += a # 낮
if (h >= v):
break
h -= b # 밤
if (h == v):
break
print(days)
결과는 시간초과.
이 문제의 시간 제한은 0.25초이기 때문에 반복문을 사용하지 않고 구현해야 한다.
✅ 접근 방식 2
반복문을 사용하지 않고 이 문제를 풀려면 어떻게 해야할까? .......
반복문을 사용했던 이유는 아래와 같다.
- 하루에 오르내리는 높이와 days를 카운팅하면서 오르내리는 높이와 나무 높이 V를 비교하기 위함.
- 비교해서 달팽이가 올라간 높이 h가 나무 높이 V 이상이 되는 즉시 break를 해 최소 days를 구하기 위함.
그렇다면 days를 증가시키며 찾지 말고, 아예 변수화 해버린 뒤에 찾아 보자.
낮에 정상에 올라갔다면 미끄러지지 않으므로 (-b 수행 X) 위와 같이 부등식을 도출했다.
반복문 없이 v <= (a - b) * days + b
를 만족하는 days의 최소값을 구하려면?
일단 v == (a - b) * days + b
를 만족하는 days의 값을 구해보자. (days = (v - b) / (a - b)
이용)
→ tc1) days == 5, tc2) days == 1.25
"몇 일" 걸리는지 출력해야 하므로 days가 정수일 경우 그대로 출력하고 소수일 경우 올림하여 정수형으로 출력하면 된다.
→ tc1) days == 5, tc2) days == 2
Solution 1. math.ceil() 이용
import sys
import math
a, b, v = map(int, sys.stdin.readline().split())
# v <= (a - b) * days + b 를 만족하는 days의 최솟값 출력
days = (v - b) / (a - b)
print(math.ceil(days))
Solution 2. int() 이용
import sys
a, b, v = map(int, sys.stdin.readline().split())
# v <= (a - b) * days + b 를 만족하는 days의 최솟값 출력
days = (v - b) / (a - b)
print(int(days) if days == int(days) else int(days) + 1) # days가 정수가 아니라면 +1
https://www.acmicpc.net/problem/2869
'Algorithm & Data structure > 알고리즘 문제 풀이' 카테고리의 다른 글
[Python][백준 BOJ Silver V] 2628. 종이 자르기 : 정렬, 리스트 컴프리헨션을 활용한 출력 (0) | 2023.12.16 |
---|---|
[Python][백준 BOJ Bronze I] 4344. 평균은 넘겠지 : f-string 소수점 출력 포맷팅, 배열 슬라이싱 (0) | 2023.12.14 |
[Python][백준 BOJ Bronze I] 10989. 수 정렬하기 3 : 메모리 초과 해결, 계수 정렬 (0) | 2023.12.04 |
[Python][백준 BOJ Silver II] 1541. 잃어버린 괄호 : enumerate (5) | 2023.10.29 |
[Python] VSCode에서 txt파일 통한 입력값 받기 (0) | 2023.10.22 |
Comments