반응형
문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 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;
}
반응형
'코테 문제' 카테고리의 다른 글
[백준] 2869번: 달팽이는 올라가고 싶다. (0) | 2021.01.06 |
---|---|
[백준] 1193번: 분수찾기 (0) | 2021.01.05 |
[아무문제] 다항식 더하기 프로그램 (0) | 2020.04.25 |
[아무문제] 정해진 그룹으로 역출력하는 프로그램 (5) | 2020.04.24 |
[백준] 2562번: 최댓값 (0) | 2020.04.22 |
댓글