C#/알고리즘

17. 1038번 감소하는 수

dev_sr 2020. 9. 6. 22:20
 

1174번: 줄어드는 숫자

음이 아닌 정수를 십진법으로 표기했을 때, 왼쪽에서부터 자리수가 감소할 때, 그 수를 줄어드는 숫자라고 한다. 예를 들어, 321와 950은 줄어드는 숫자이고, 322와 958은 아니다. N번째로 작은 줄어�

www.acmicpc.net

문제를 이해 못해서 구글갓의 힘을 빌림..

-1이 왜 출력되어야 하는지 이해가 안갔는데

가장 큰값이 9876543210 이고 이때 N은 1023임

따라서 1023 보다 큰 값이 입력되면 무조건 -1이 출력되어야함

 

예제는 0만 나와 있고 0 다음엔 10, 20, 21인줄 알았는데

0 다음엔 1,2,...8,9,10,20,21 이란다.. 1~9도 줄어드는 숫자였음

 

아무튼 숫자가 0,1,2,3,....9,10,20,21,30,31,32,40....9876543210 이렇게 만들어져야하고

이중 N번째에 해당하는만큼 작은 수(2라면 2번째로 작은 수 ->1)가 출력되어야 함

 

검색해보니 문자열로 1,2,3,4...9까지 미리 저장해놓고 재귀호출로 조합하는 방법이 있던데

봐도 잘 모르겠어서 큐를 이용하는 방법을 찾음

 

이분 코드 많이 참고함 

 

[백준] 1038번 감소하는 수, 1174번 줄어드는 수

문제 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 ��

kswims.tistory.com

큐에 먼저 0부터 9까지 넣어놓고 카운트를 증가시킴

N이 10이하라면 (10포함) 카운트 그대로 출력시키면 되고 (답이 0~9)

아니라면 카운트< N 인 조건이 만족할 동안 while문을 반복시킴

 

큐의 첫번째 요소를 10으로 나머지 계산을 하고 (5%10 하면 5가 나옴 / 10의 배수는 당연히 0)

그것만큼 반복문을 돌리면서 값을 만들어서 다시 큐에 넣어줌

(큐에 있던 첫번째 값이 5이고 나머지가 5라면 50, 51, 52, 53, 54 가 생긴다)

 

먼저 있던 큐의 첫번째는 날림

카운트는 계속 + 하면서 N과 같아지면 break함

 

long으로 안하면 값이 제대로 안나옴

int로 하면 N==1023이 9876543210 이 나와야하는데 이상한 값이 나온다.

 

어려웠다..

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace _1174
{
    class Program
    {
        static void Main(string[] args)
        {
            Queue<long> queue = new Queue<long>();
            int N = Int32.Parse(Console.ReadLine());

            int count = 0;
            long first = 0;
            long temp = 0;
            long result = 0;

            for (int i = 0; i < 10; i++)
            {
                if(i+1==N)
                {
                    result = count;
                }
                queue.Enqueue(i);
                count++;
            }

            if(N>1023)
            {
                result = -1;
            }

            else if(N>10)
            {
                while(count<N)
                {
                    first = queue.First();
                    queue.Dequeue();

                    temp = first % 10;

                    for(int j=0; j<temp; j++)
                    {
                        result = first * 10 + j;
                        queue.Enqueue(result);
                        count++;

                        if(count==N)
                        {
                            break;
                        }
                    }

                }
            }

            Console.WriteLine(result);
            
        }
    }
}

 

 

'C# > 알고리즘' 카테고리의 다른 글

16. 2805번 나무 자르기  (0) 2020.09.06
15. 8980번 택배  (0) 2020.09.05
14. 4963번 섬의 개수  (0) 2020.09.05
13. 1967번 트리의 지름  (0) 2020.07.26
12. 1074번 Z (시간 줄임)  (0) 2020.07.11