알고리즘/백준 BAEK JOON
1094.막대기
IMyoungho
2020. 4. 26. 16:38
1094 역시 굉장히 쉬운문제이다.
이 문제는 쉽지만 포스팅하는 이유는 문제를 읽으면서 드디어 효율을 동시에 생각하기 시작했다고 느꼈기 때문이다.
이 문제는 막대기를 잘라서 자기가 원하는 X의 길이의 막대기를 만들어내는 문제이다.
푸는 방법은 다양하다. 어쩌면 비슷할 수도 있다. 왜냐하면 간단한 로직으로 누구나 풀 수 있기 때문이다.
1094번: 막대기
지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다. 막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다. 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면,
www.acmicpc.net
< Code 설명 >
#include <iostream>
using namespace std;
int stick[7] = { 64, 32, 16, 8, 4, 2, 1}; // 미리 막대기를 나눠놓음
int main() {
int x; // 원하는 길이 변수
int cnt = 0; // 막대기 숫자 세기
cin >> x; // 원하는 길이 입력받기
while (x != 0){ // 막대기가 완성될 때까지 돌리자~
for (int i = 0; i < 7; i++){
if (x < stick[i]) // 저장해놓은 막대기보다 원하는길이가 짧으면
continue; // PASS!!
x -= stick[i]; // 위의 조건문을 pass한다면 크기를 빼주자
cnt++; // 막대기 수 up!
}
}
cout << cnt << "\n";
return 0;
}
나는 이 문제를 풀 때 64길이의 주어진 막대기에 주목했다.
어처피 주어진 막대기를 반씩 잘라서 사용할 것이기 때문에 막대기의 크기는 한정적이기 때문이다.
바로 { 64, 32, 16, 8, 4, 2, 1 } 이렇게 7종류의 막대기만이 우리가 다룰 수 있는 막대기이다.
때문에 배열에 미리 넣어놓으면 굳이 반으로 자르는 로직을 구현할 필요가 없다.
반드시 알아야 할 TIP!!
# 비교대상이 무언가 정해진 경우 굳이 연산을 통할 필요없이 미리 만들어놓고 비교하는 것도 하나의 방법이 될 수 있다.
반응형