문 제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 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) 값을 이동 거리로 판단!
```