본문 바로가기
코테 문제

[백준] 2292번: 벌집

by 케찹이 2021. 1. 5.
반응형

문제

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

입력

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

출력

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

 

 

 

#include<iostream>

int main()
{
	int input;
	scanf("%d", &input);		//입력값 받음 
	
	if(input == 1)				//입력값이 처음 시작값인 1이면 결과값인 거리 1을 출력시키고 종료 
	{
		std::cout << 1 << std::endl;
		return 0;
	}
	
	int n = input - 2;			//n은 입력값 - 2 
	int m = n / 6;				//m은 (입력값 - 2) / 6, m은 같은 층의 벌집의 최고값이 1로 인해서 6으로 나누어 떨어지지 않음 
	
	int distance = 1;			//distance는 1로부터의 거리 
	int div = 0;				//div은 벌집의 층 마다 6으로 부터 나누어 떨어지는 값. m과 비교하여 결과를 출력하게 됨 
								//예를 들어 input값이 2,3,4,5,6,7일때 m을 계산했던 것처럼 div = (x-1)/6 을 계산하여 얻어지는 값 
	int size_of_distance = 0;	//div은 각 층마다 그 개수가 하나씩 늘어나는데 그 개수를 늘리게 해주는 변수 
	while(div < 166666666)		//입력값은 최대 1억임으로 1억을 6으로 나눈 근사값 
	{
		distance++;
		size_of_distance = 0;
		while(size_of_distance < distance - 1)		//distance와 div의 관계를 살펴보면 div의 개수는 항상 distance - 1이다 
		{
			if(m == div)							//m과 div의 값이 같으면 해당 distance를 출력 
			{
				std::cout << distance << std::endl;
				return 0;
			}
			div++;									//그렇지 않다면 div와 size_of_distance를 1을 올린다. 
			size_of_distance++;						//뭔가 직관적이지 않지만 하나씩 숫자를 대입해보면 나름 정확하다. 
		}
	}
	
	return 0;
}
반응형

댓글