안녕하세요, 성조입니다.
이번 포스팅은 자바 11 버전으로 풀이됐습니다.
문제출처
https://www.acmicpc.net/problem/1094
1094번: 막대기
지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대
www.acmicpc.net
문제
지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른 다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.
막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.
1.지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
- 가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.
- 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.
2. 이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.
X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 X가 주어진다. X는 64보다 작거나 같은 자연수이다.
출력
문제의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 출력한다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int Xcm = Integer.parseInt(br.readLine());
int req = 64;
int count = 0;
while(Xcm > 0) {
if(req > Xcm) {
req /= 2;
}
else{
Xcm -= req;
count++;
}
}
System.out.println(count);
}catch(IOException e) {
System.out.println("error");
}
}
}
풀이
지문을 읽어보면 다음과 같이 정리된다.
1. X 값을 입력받을 수 있다.
2. 지민이의 막대는 64cm 값을 기본으로 가지고 있다.
3. 64cm의 막대 한개로 시작한다.
4. 64cm(가지고 있는) 막대를 절반으로 나눈다 == [막대 / 2]
이 부분에서 조금 더 풀이를 들어가면 다음과 같이 정리된다.
'자른 막대의 절반 중 하나를 버리고' 즉, 제외한다는 마이너스의 의미이다.
막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다이 의미는 100을 2개로 나눴을 때 50이 남고, 입력받은 X보다 나눠진 50이 더 큰 경우에 50 하나를 버리고 나머지 50만 값을 가진다는 의미이다.
23을 입력 받았다고 가정한다.
처음에 64cm로 시작한 지민이의 막대는 64cm -> 32cm -> 16cm까지 작아지고 X 값에서 지민이의 막대 값이 제외될 것이다.
23cm - 16cm = 7cm [ count ]
다시 지민이의 막대인 16cm가 더 크기 때문에 다시 나눠준다. 16cm -> 8cm -> 4cm [O] X값에서 빼는 것을 반복한다.
7cm - 4cm = 3cm [ count ]
4cm -> 2cm [O]
3cm - 2cm = 1cm [ count ]
2cm -> 1cm [O]
1cm -> 1cm [count]
위의 내용처럼 총 4번의 카운트가 진행되는 것이다.
이 문제는 단순하게 구현되는 것인데 지문을 읽는 시간이 생각보다 걸렸다는 것이 아쉬웠습니다.
오타나 이해가 안 가는 부분이 있다면 언제든지 댓글로 얘기해 주시면 감사드리겠습니다.
다음 포스팅 때 뵙겠습니다!
'백준 - Java' 카테고리의 다른 글
[백준 - 3009][Java] 네 번째 점 (0) | 2023.01.12 |
---|---|
[백준 - 1427][Java] 소트인사이드 (0) | 2023.01.11 |
[백준 - 1312][Java] 소수 (0) | 2023.01.08 |
[백준 - 1032][Java] 명령 프롬프트 (0) | 2023.01.07 |
[백준 - 4673][Java] 셀프 넘버 (0) | 2023.01.02 |