[백준 BOJ] 2292번 벌집 (C++/cpp)

2022. 4. 10. 00:56PS (Program Solving)/BOJ (백준)

문제 설명

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

 

2292번: 벌집

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

www.acmicpc.net

백준 BOJ 2292번 벌집 문제 사진

 

접근 방법 - 규칙을 찾아 해결하는 문제

백준의 2292번 문제는 특정 규칙을 찾은 뒤 이를 이용하여 해결해야 하는 문제이다.

해당 문제는, 육각형으로 이루어진 벌집에 대하여 입력받은 번호의 방에 도달하기 위해 거쳐야 하는 최소 방의 개수를 출력해야 하는 문제이다.

필자는 해당 문제 해결을 시도할 당시 아래와 같은 규칙을 찾아내었다.

ans : 1 -> 1 (1개)
ans : 2 -> 2 ~ 7 (6개)
ans : 3 -> 8 ~ 19 (12개)
...

=> 정답이 1씩 늘어날 때마다, 해당 정답에 속하는 입력값의 개수가 6, 12, ... 개씩 늘어난다.

필자는 위 규칙을 이용하여 아래의 순서대로 코드를 작성해 문제를 해결하였다.

 

코드의 실행 순서

1) 목적지 방의 번호(n)를 입력받는다.

(여기서, n을 1로 입력받았을 경우엔 정답으로 1을 출력한 뒤 즉시 실행 종료하도록 한다.)

 

2) sum은 1로 초기화하여 선언하고, num은 2로 초기화하여 선언한다.

(여기서, sum은 위 규칙의 "ans에 속하는 방의 개수"이고, num은 정답을 저장하는 변수(ans)이다.)

 

3) 무한 반복문을 이용해 아래의 연산을 취한다.

- 제어 변수 i는 6으로 초기화해두고, 반복문을 실행할 때마다 i에 6씩 더하도록 한다.

-  n이 sum+i보다 작거나 같으며 sum보다 클 경우, 즉시 num을 출력하고 실행 종료한다.

(ex) n이 6인 경우 -> 6(n)은 7(sum+i)보다 작으며 2(sum)보다 크기 때문에, 이 경우 정답은 2이다. (위 규칙 설명 참고)

- 실행 종료되지 않았을 경우, 다음 반복문 연산을 위해 sum에는 현재의 i를 더하고 num에는 1을 더한 뒤, 계속 진행한다.

 

4) 3)의 반복문이 종료될 때까지 반복한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;

//백준 2292번 코드
int main() {
	int n;
	cin >> n;

	if (n == 1) { cout << 1 << endl; return 0; }
	int sum = 1;
	int num = 2;
	for (int i = 6; 1; i += 6) {
		if (n<=(sum+i) && n>sum) {
			cout << num << '\n';
			return 0;
		}
		sum += i;
		num++;
	}
}

 

제출 결과

백준 BOJ 2292번 벌집 문제 C++ 제출 결과

(2022.02.26 백준 2292번 문제 제출 결과)

반응형