티스토리 뷰
백준 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 //= 2k + temp <= N이면 현재 조각을 남깁니다 →temp += k,cnt += 1temp == 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
결론
'백준 스터디' 카테고리의 다른 글
| 백준 1120번 문자열 Python (0) | 2025.10.10 |
|---|---|
| 백준 16234 인구 이동 Python (0) | 2025.10.09 |
| 백준 2665번 미로만들기 Python (0) | 2025.10.07 |
| 백준 1059 좋은 구간 (Python) (0) | 2025.10.06 |
| 백준 16967 배열 복원하기 Python (0) | 2025.09.05 |
- Total
- Today
- Yesterday
- 프로그래밍
- 알고리즘
- 코딩 테스트
- 문제 풀이
- 파이썬코딩
- 문제풀이
- 코딩테스트
- 알고리즘문제풀이
- python 알고리즘
- 동적 계획법
- 문자열처리
- 코딩
- 상속
- Python
- 백준
- 객체지향
- C++
- 알고리즘 문제풀이
- 프로그래머스
- 파이썬
- 그리디알고리즘
- 그리디
- dfs
- 동적계획법
- 브루트포스
- HTML
- 그래프 탐색
- c언어
- DP
- 알고리즘기초
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
