티스토리 뷰
백준 1094번 막대기 (Python)
문제
● 문제 설명
한 사람이 길이 64cm인 막대를 가지고 있습니다.
그는 이 막대를 자르기 시작합니다.
자를 때는 항상 절반으로만 자를 수 있습니다.
자른 막대 중 일부를 버리거나 남길 수 있습니다.
남은 막대의 총합이 원하는 길이 N과 같아지면 그만 자릅니다.
즉,
- 64cm 막대 하나를 시작으로,
- 절반으로 나누고,
- 일부를 버리거나 남기면서
- 남은 막대들의 길이 합이 N이 되도록 하는 문제입니다.
● 입력
23
● 출력
4
문제 작동원리
이 문제는 물리적으로 생각하면 막대를 절반씩 나누어가며 길이의 합을 조절하는 원리입니다.
즉, 처음 막대의 길이(64cm)를 기준으로 절반씩 줄여가며
필요한 길이만큼의 합을 남겨두는 과정입니다.
이 원리는 “이진 분할(binary division)”의 구조를 가집니다.
즉,
64 → 32 → 16 → 8 → 4 → 2 → 1
이렇게 계속 절반으로 나누어가며,
각 조각이 남거나 버려지는 형태를 통해
최종적으로 원하는 길이를 표현할 수 있습니다.
이것은 2진수 표현과 같은 원리로 작동합니다.
예를 들어 23을 2진수로 바꾸면 \( 10111 \)이 되는데,
이는 16 + 4 + 2 + 1의 합으로 구성됩니다.
즉, 2의 거듭제곱 단위로 이루어진 조각을 더해서 목표 길이를 만드는 원리입니다.
아이디어
이 코드는 직접적인 시뮬레이션 방식을 사용합니다.
즉, 실제로 막대를 자르고, 더하고, 비교하면서
필요한 조각의 개수를 구합니다.
이 과정은 다음과 같습니다.
이 과정을 코드에서는 다음과 같이 표현합니다.
k
는 현재 막대의 길이(초기값 64)
temp
는 지금까지 더한 길이
cnt
는 남긴 막대의 개수
실행 흐름은 다음과 같습니다.
k + temp > N
이면 현재 조각은 너무 큽니다 →k //= 2
k + temp <= N
이면 현재 조각을 남깁니다 →temp += k
,cnt += 1
temp == N
이면 종료 후cnt
출력
즉,
“현재 길이에 이 조각을 더해도 목표를 넘지 않으면 더한다”
는 단순한 비교 구조입니다.
전체 코드
N = int(input())
temp = 0
k = 64
cnt = 0
while True:
if temp == N:
print(cnt)
break
if k + temp > N:
k //= 2
else:
temp += k
k //= 2
cnt += 1
결론
'백준 스터디' 카테고리의 다른 글
백준 2665번 미로만들기 Python (0) | 2025.10.07 |
---|---|
백준 1059 좋은 구간 (Python) (0) | 2025.10.06 |
백준 16967 배열 복원하기 Python (0) | 2025.09.05 |
백준 16967 배열 복원하기 C++ (0) | 2025.09.05 |
백준 2607 비슷한 단어 Python (0) | 2025.09.04 |
- Total
- Today
- Yesterday
- 동적계획법
- 코딩
- C++ 알고리즘
- 그리디
- c++알고리즘
- C++
- 코딩테스트
- DP
- 문제풀이
- 브루트포스
- 문자열처리
- 코딩 테스트
- 알고리즘
- 프로그래밍
- Python
- 그리디알고리즘
- 파이썬
- 알고리즘문제풀이
- 객체지향
- 그래프 탐색
- python 알고리즘
- 파이썬코딩
- 문제 풀이
- 동적 계획법
- c언어
- 알고리즘기초
- 백준
- dfs
- 알고리즘 문제풀이
- 인접 행렬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |