문 제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

입 력

첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

13

출 력

입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.

3

코 드

using System;
using static System.Console;

namespace algorithm
{
class Program
{
static void Main(string[] args)
{
int input = int.Parse(ReadLine());
int output = 1;
int count = 1;

            while (input > output)
            {
                output += 6 * (count - 1);
                count += 1;
            }

            if (input == 1)
                WriteLine(count);
            else
                WriteLine(count - 1);
        }
    }

}

비교코드 - 1

공 부

계차 수열

  • 위 문제는 공차의 간격이 6의 배수로 일정한 ‘계차수열’이다!

b(n) = b(1) + 6 x (n - 1) = 6n

b(n-1) = 6(n - 1)

while (input > output)
{
	output +=  6 * (n - 1); 
	n += 1;
}

계차 수열식을 이용하여 output에 값을 더하면서 input 보다 커지는 순간의 (n - 1) 값을 이동 거리로 판단!

```