본문 바로가기
알고리즘/백준

[백준] 2292 벌집 C#

by 개발하는 디토 2022. 10. 25.

한수

문제

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오. 

입력

첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.

출력

첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.

예제 입력 1

110

예제 출력 1

99

예제 입력 2

1

예제 출력 2

1

예제 입력 3

210

예제 출력 3

105

예제 입력 4

1000

예제 출력 4

144

예제 입력 5

500

예제 출력 5

119

 

풀이

같은 육각형 라인에 있는 최대 방 번호를 알아야 몇 개의 방을 거쳐 해당 번호의 방으로 갈 수 있는지 알 수 있다. 같은 육각형 라인의 최대 방 번호는 1번에서 시작해  7 19 37 61 ... 순으로 나아간다.

1   7   19   37   61  
  + 6*1   + 6*2   + 6*3   + 6*4   + 6*5

가려는 방이 6번 방이면 ->  1 < 6 <= 7 이므로 2개의 방을 거친다.

가려는 방이 21번 방이면 -> 19 < 21 <= 37 이므로 4개의 방을 거친다.

 

List에 1을 넣어놓고 i를 하나씩 증가시켜 가면서 6*i를 리스트의 마지막 숫자에 더해 다음 숫자를 만드는 방식으로 문제를 해결했다.

 

using System;
using System.Collections.Generic;

namespace Baekjoon
{
    class Program
    {
        static void Main(string[] args)
        {
            //1    7     19     37     61
            //  +6   +12    +18    +24
            int num = int.Parse(Console.ReadLine());
            List<int> list = new List<int>();
            list.Add(1);
            if (num == 1) Console.WriteLine(1);

            for (int i=1; ; i++)
            {
                list.Add(6 * i + list[i-1]);
                if (num <= list[i])
                {
                    Console.WriteLine(i + 1); 
                    break;
                }
            }
        }
    }
}

 

댓글