File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ # [ Silver V] 막대기 - 1094
2+
3+ [ 문제 링크] ( https://www.acmicpc.net/problem/1094 )
4+
5+ ### 성능 요약
6+
7+ 메모리: 69100 KB, 시간: 8 ms
8+
9+ ### 분류
10+
11+ 비트마스킹, 수학
12+
13+ ### 제출 일자
14+
15+ 2025년 1월 3일 21:41:29
16+
17+ ### 문제 설명
18+
19+ <p >지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.</p >
20+
21+ <p >막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.</p >
22+
23+ <ol >
24+ <li>지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
25+ <ol>
26+ <li>가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.</li>
27+ <li>만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.</li>
28+ </ol>
29+ </li>
30+ <li>이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.</li>
31+ </ol >
32+
33+ <p >X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오. </p >
34+
35+ ### 입력
36+
37+ <p >첫째 줄에 X가 주어진다. X는 64보다 작거나 같은 자연수이다.</p >
38+
39+ ### 출력
40+
41+ <p >문제의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 출력한다.</p >
42+
Original file line number Diff line number Diff line change 1+ let x = Int ( readLine ( ) !) !
2+ var sticks : [ Int ] = [ 64 ]
3+ while sticks. reduce ( 0 , + ) > x {
4+ let shortStick = sticks. popLast ( ) !
5+ let halfStick = shortStick/ 2
6+ if sticks. reduce ( 0 , + ) + halfStick >= x {
7+ sticks. append ( halfStick)
8+ continue
9+ }
10+ sticks. append ( halfStick)
11+ sticks. append ( halfStick)
12+ }
13+ print ( sticks. count)
You can’t perform that action at this time.
0 commit comments