⌨️CS-PS/백준_수학&구현

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

미르의 블로그 2023. 1. 20. 10:00
728x90
반응형
『목차』
0. 개요

1. 문제
2. 풀이
3. 코드

0. 개요

벌집을 가장한 수열 문제. 수열의 형성 원리를 빠르게 파악하는 것이 문제의 키포인트다.

1. 문제

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

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

[문제]

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

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

[입력]

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

[출력]

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

[예제 입력 1]

13

[예제 출력 1]

3

2. 풀이

[1] & [2, 3, 4, 5, 6, 7] & [8, 9, 10, ..., 19] & [20, 21, 22, ..., 37] & ...

이렇게 각각이 1세트이다. 각 세트의 끝 수만 비교해보면,

1 -> 7 -> 19 -> 37 -> 61
  +6   +12   +18   +24  

위와 같은 원리로 수열이 구성된다. 정리해보면

숫자 = num 세트 = level
<= 1 1
2 <= && <= 7 2
8 <= && <= 19 3
20 <= && <= 37 4
... ...

3. 코드

#pragma warning (disable:4996)
#include <stdio.h>

int main(int argc, char* argv[]) {
	int N; scanf("%d", &N);

	int num, level;
	for (num = 1, level = 1; num < N; num += (6 * level++)) {}

	printf("%d", level);

	return 0;
}
728x90
반응형