문제 풀이/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);
        }
    }
}