문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다.
그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를
주소로 매길 수 있다.
숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지
(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오.
예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
예제 입력 1
13
예제 출력 1
3
#include <stdio.h>
int main() {
int n;
int i = 0;
scanf("%d", &n);
for (int sum = 2; sum <= n; i++) {
sum += 6 * i;
}
if (n == 1) i = 1;
printf("%d", i);
return 0;
}
1을 1층, 2~7을 2층, 8~19를 3층, ... 라고 했을때, 각 층별 갯수는 1개, 6개, 12개, ... 로 늘어난다.
우리가 구하고자 하는 답은 결국 몇개의 층을 지나가야 하는지, 즉 몇층에 있는지를 알아내면 된다.
위 코드에서 i를 층으로 두었다.
결국 각 층은 6의 배수로 갯수가 늘어나므로, sum을 2로 초기화 시키고, sum에 층 별 갯수를 다 더해주어,
몇 층인지 알아내면된다.
sum을 2로 초기화 시키는 이유는 6의 배수로 sum이 늘어날 때, 만약 sum이 0으로 초기화 되있다고 하고,
n이 19라고 해보자.
그러면 결국 반복문이 3번돌아 i는 3이될것이고, sum은 18이 될것이다.
하지만 18 < 19 이기 때문에 반복문이 한번 더 돌아 i는 4가 될것이다. 19는 3층인데 말이다.
다른 층도 똑같다.
따라서 sum을 미리 2로 초기화 해놓으면 딱 제 층에서 멈출것이다.
'PS > 백준' 카테고리의 다른 글
백준 / 스택 / 10828번 / 스택 / C++ (0) | 2021.07.16 |
---|---|
백준 / 문자열 / 1316번 / 그룹 단어 체커 / C++ (0) | 2021.07.14 |
백준 / 기본 수학 1 / 1712번 / 손익분기점 / C++ (0) | 2021.07.13 |
백준 / String(문자열) / 10988번 / 팰린드롬인지 확인하기 / C (0) | 2021.02.27 |