문제 풀이/C#
[25597] - 푸앙이와 러닝머신
Chamber
2022. 11. 15. 18:58
https://www.acmicpc.net/problem/25597
25597번: 푸앙이와 러닝머신
주어진 시간동안 정확히 목표 거리를 이동하는 것이 가능하다면, 첫 번째 줄에 버튼을 눌러야 하는 최소 횟수 $N$을 출력하고, 다음 $N$개의 줄에 걸쳐 버튼을 누르는 시각과 버튼의 종류를 공백
www.acmicpc.net
접근 방법
1. 가장 적게 버튼을 조작해야되니 0은 안눌러도 되고, 1로 나누었을 때, 4-1 순으로 나누었을 때, 8-4-1순으로 나누었을 때로 나누어 계산 - 틀림
2. 문제에 써있지는 않는데 출력 3번을 보면, 버튼 한번에 1로 나누어져서 출력이 30 1이 될 수 있지만 45 4가 출력 됨
- 가장 적게 누른 순 -> 숫자가 큰 순(내림차순?)
3. 내림차순으로 1개, 2개 3개 구간 나누어지는지 확인 -> 8, 4, 1, 8-4, 8-1, 4-1, 8-4-1
문제 풀이
- 1,4,8의 몫을 담을 변수 생성
- 가장 적게, 내림차순으로 조건문을 돌며 되면 그 조건 사용
- 리스트에 시간 - 1의 몫, 시간 - 4의 몫, 시간 - 8의 몫을 하면 버튼을 누르는 타이밍이 나온것을 넣기 (시간*속도 = 거리, 내림차순이니 1부터 계산해주기)
- 출력형식에 맞게 리스트값 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Gold
{
class _25597
{
static void Main(string[] args)
{
StringBuilder stb = new StringBuilder();
//n[0] = X미터, n[1] = T초
int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int one_div = 0;
int four_div = 0;
int eight_div = 0;
int count = 0;
int time = n[1];
//8
if (n[0]%8 == 0 && n[0]/8 <= n[1])
eight_div = n[0]/8;
//4
else if (n[0] % 4 == 0 && n[0] / 4 <= n[1])
four_div = n[0] / 4;
//1
else if (n[0] <= n[1])
one_div = n[0];
//8 4
else if ((n[0] % 8) % 4 == 0 && (n[0] / 8) + ((n[0] % 8) / 4) <= n[1])
{
eight_div = n[0] / 8;
n[0] %= 8;
four_div = n[0] / 4;
}
//8 1
else if ((n[0]/8) + (n[0]%8) <= n[1])
{
eight_div = n[0] / 8;
n[0] %= 8;
one_div = n[0];
}
//4 1
else if ((n[0] / 4) + (n[0] % 4) <= n[1])
{
four_div = n[0] / 4;
n[0] %= 4;
one_div = n[0];
}
//8 4 1
else if ((n[0] / 8) + ((n[0] % 8) / 4) + ((n[0] % 8) % 4) <= n[1])
{
eight_div = n[0] / 8;
n[0] %= 8;
four_div = n[0] / 4;
n[0] %= 4;
one_div = n[0];
}
else
{
Console.WriteLine(-1);
return;
}
int[] arr = {one_div, four_div, eight_div};
List<(int, int)> list = new List<(int, int)> ();
for(int i = 0; i<3; i++)
{
int num;
if (i == 0)
num = 1;
else if (i == 1)
num = 4;
else
num = 8;
if(arr[i] != 0)
{
count++;
list.Add((time - arr[i], num));
time -= arr[i];
}
}
stb.AppendLine(count.ToString());
for (int i = list.Count - 1; i >= 0; i--)
stb.AppendLine($"{list[i].Item1} {list[i].Item2}");
Console.WriteLine(stb);
}
}
}