C# 백준 알고리즘
C# 백준 1094 막대기
프로핌
2023. 8. 6. 21:44
문제
지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.
막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.
- 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
- 가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.
- 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.
- 이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.
X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 X가 주어진다. X는 64보다 작거나 같은 자연수이다.
출력
문제의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 출력한다.
예제 입력 1
23
예제 출력 1
4
예제 입력 2
32
예제 출력 2
1
예제 입력 3
64
예제 출력 3
1
예제 입력 4
48
예제 출력 4
2
난이도 : 중하
소요시간 : 40분
지민이는 무조건 64cm길이인 막대기를 가지고 있기 때문에 List<int> 인 stick 에다 64를 인덱스에 저장을 하고
while문을 돌려서 그 안에 for문에 더하기를 해서 a보다 같거나 클때까지 sumstick 변수에다 저장을 하면서 더할때마다 stickcount 변수에다 저장 sumstick이 a 랑 같을때 while문에 빠져나오고 stickcount를 출력
같지 않으면 제일 짧은 값(stick.count - 1 )을 나누고 만약에 인덱스 0번이 a보다 크면 Remove 이런식으로 a랑 같아질때 까지 호출
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Prob1094_막대기
{
class Program
{
static void Main(string[] args)
{
int a = int.Parse(Console.ReadLine());
int sumstick = 0;
int stickcount = 0;
List<int> stick = new List<int>{ 64 };
while (true)
{
for (int i = 0; i < stick.Count; i++)
{
int sumsumstikc = sumstick + stick[i];
if (sumsumstikc == a)
{
sumstick += stick[i];
stickcount++;
break;
}
else if (sumsumstikc < a)
{
sumstick += stick[i];
stickcount++;
}
}
if (sumstick == a)
break;
else if (sumstick != a)
{
int halfsitck = stick[stick.Count - 1] / 2;
stick.Remove(0);
stick.Add(halfsitck);
stick.Add(halfsitck);
if (stick[0] > a)
stick.Remove(0);
}
sumstick = 0;
stickcount = 0;
}
Console.WriteLine(stickcount);
}
}
}