본문 바로가기

C++/백준

[C++][백준] 2292 벌집

https://www.acmicpc.net/problem/2292

 

2292번: 벌집

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

www.acmicpc.net

문제

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

입력

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

출력

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

예제 입력 1

13

예제 출력 1

3

 

변수 r은 1, 2~7, 8~19 .. 를 의미하고,

변수 t는 겹을 의미한다.

무한반복문을 돌며 벌집의 숫자가 내가 입력한 방보다 클 경우 빠져나오게 된다.

이 때 몇개의 방을 지나쳤는지 알기위해 a=6*t 를 이용하고 한겹이 추가되는 것이므로 t++을 해준다.

그리고 r에 a를 더해주어 다음 겹의 방 숫자를 저장하게 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
 
int main() {
    int n;
    scanf("%d"&n);
    if(n<1 || n>1000000000){
        printf("다시 입력해주세요\n");
        scanf("%d"&n);
    }
 
    int r=1;    //2~7, 8~19 ...
    int t=1;    //겹
    int a=1;    //겹 계산할 때 쓸 것
 
    while(true){
        if(r>=n)
            break;
        a=6*t++;
        r+=a;
    }
 
    printf("%d\n", t);
}
 

 

'C++ > 백준' 카테고리의 다른 글

[C++][백준] 2438 별 찍기 - 1  (0) 2020.03.10
[C++][백준] 2309 일곱 난쟁이  (0) 2020.03.10
[C++][백준] 2231 분해합  (0) 2020.03.09
[C++][백준] 2156 포도주 시식  (0) 2020.03.09
[C++][백준] 2108 통계학  (0) 2020.03.09