문제를 이해 못해서 구글갓의 힘을 빌림..
-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까지 미리 저장해놓고 재귀호출로 조합하는 방법이 있던데
봐도 잘 모르겠어서 큐를 이용하는 방법을 찾음
이분 코드 많이 참고함
큐에 먼저 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 |