문제
시간 제한 : 2초, 메모리 제한 : 128 MB
지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른 다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.
막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.
- 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
- 가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.
- 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.
- 이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.
X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 X가 주어진다. X는 64보다 작거나 같은 자연수이다.
출력
문제의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 출력한다.
입출력 예
제출 코드
x = int(input())
lst = [64]
while sum(lst) > x:
tmp = lst.pop()//2
lst.extend([tmp, tmp])
if sum(lst[:-1]) >= x:
lst.pop()
print(len(lst))
(1) line 2
지민이가 처음 가지고 있는 막대기의 길이인 64를 lst의 원소로 넣어준다.
(2) line 3
막대를 자르는 과정은 지민이가 가지고 있는 막대의 길이의 합이 X보다 크지 않을 때만 진행하면 되기 때문에 line 3처럼 while문의 조건을 걸어준다.
(3) line 5, 6
문제에서 제시된 과정 중 1번의 하위 1번에 해당한다. 가지고 있는 막대 중 길이가 가장 짧은 것을 이용한다는 점과 시간복잡도를 줄여야 한다는 생각으로 pop과 extend를 이용했다.
* pop의 연산 시간 = O(1)
* extend([tmp, tmp])의 연산 시간 = O(len(list)) = 연산 시간이 O(1)인 append를 두 번 한 것과 동일
(4) line 6, 7
문제에서 제시된 과정 중 1번의 하위 2번에 해당한다.
(5) line 8
문제에서 제시된 과정 중 2번에 해당한다. 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 출력하라는 요구사항이 있었기에 다른 과정은 필요 없이 리스트의 길이(= 잘려있는 막대기의 개수)를 반환해준다.
Source : https://www.acmicpc.net/problem/1094
'PS > 백준' 카테고리의 다른 글
[백준 알고리즘][파이썬/Python] 1500번: 최대 곱 (0) | 2020.04.15 |
---|---|
[백준 알고리즘][파이썬/Python] 1812번: 사탕 (0) | 2020.04.14 |
[백준 알고리즘][파이썬/Python] 2293번: 동전 1 (4) | 2020.04.09 |
[백준 알고리즘][파이썬/Python] 1946번: 신입 사원 (3) | 2020.04.08 |
[백준 알고리즘][파이썬/Python] 1541번: 잃어버린 괄호 (0) | 2020.04.07 |