초보 개발자의 이야기, 릿허브

[C++] 백준 2292번 벌집 본문

코딩테스트/📗 백준 (BOJ)

[C++] 백준 2292번 벌집

릿99 2022. 3. 9. 11:25
728x90
반응형
1. 문제이해

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

 

2292번: 벌집

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

www.acmicpc.net

위의 그림과 같이 육각형 모양의 벌집이 있다.

중앙의 방 1부터 시작해서, 돌아가면서 1씩 증가하는 번호를 주소로 매길 때,

입력으로 주어진 방까지 최소 몇 개의 방을 지나야 하는지 출력하는 것이 목표이다.

 

 

 

2. 문제풀이

 

위와 같은 벌집 모양의 방들에서, 1번에서 N번째 방까지 몇 개의 방을 지나야 하는지 구하는 문제이다.

아래 그림을 자세히 보자.

 

 

위 그림에서 볼 수 있듯, 문제의 벌집 모양 방들은 아래와 같은 규칙을 가진다.

1번 이동해서 갈 수 있는 방은 6 x 0 = 1 개 (1번째 육각형)

2번 이동해서 갈 수 있는 방은 6 x 1 = 1 개 (2번째 육각형)

3번 이동해서 갈 수 있는 방은 6 x 2 = 1 개 (3번째 육각형)

4번 이동해서 갈 수 있는 방은 6 x 3 = 1 개 (4번째 육각형)

n번 이동해서 갈 수 있는 방은 6 x (n - 1) 개 (n번째 육각형)가 된다.

즉, 입력받은 방이 몇번째 육각형에 속해있는지 찾고, 이동해야 하는 방의 수를 출력해주면 된다.

이를 이용해 작성한 코드는 아래와 같다.

 

 

 

3. 소스코드
#include <iostream>
using namespace std;

int main() {
	int N;          // 가고자 하는 방
	int count = 1;  
	cin >> N;

	if (N == 1) {
		cout << "1";
		return 0;
	}

	for (int i = 1;; i++) {
		for (int j = 0; j < i * 6; j++) {
			count++;
			// N번째 방에 도달하면, 값 출력 후 종료
			if (count == N) {
				cout << i + 1;
				return 0;
			}
		}
	}
}

코드로 보면 훨씬 간단하다.

가고자 하는 방의 번호를 나타내는 변수 N, N번째 방에 도달했는지 확인을 위한 변수 count를 두었다.

for문을 이용해 계산해주기 전에, 1번 방을 가는 경우를 예외로 하여 따로 계산해주었다.

해당 경우, 지나야 하는 방의 개수는 1번 방 하나이므로 1을 출력한다.

 

이후 for문에서 2. 문제풀이에서 도출한 방식을 이용해 count를 구해주었다.

count가 N이 될 때까지 i번째 육각형의 개수를 6 * i 개씩 더해준다.

여기서, 사실 1번째 육각형은 위 1번 방을 가는 경우 예외에서 구했으므로,

해당 이중 for문은 2번째 육각형부터 출발하는 것과 같다.

따라서,

count == N 이 될 경우, i + 1을 출력해준다.

 

 


브론즈 문제여서 간단할 줄 알았는데, 생각보다 어려웠다..😱

아직 많이 부족한걸까.. 많이 자만했던것 같다..

일주일후면 소마 1차 코테인데, 그때까지 열심히 준비해봐야징💪

 

 

 

 

 

 

728x90
반응형

'코딩테스트 > 📗 백준 (BOJ)' 카테고리의 다른 글

[C++] 백준 1359번 복권  (2) 2022.07.06
[C++] 백준 9625번 BABBA  (0) 2022.04.01
[C++] 백준 1302번 베스트셀러  (0) 2022.03.07
[C++] 백준 1235번 학생 번호  (0) 2022.03.04
[C++] 백준 4779번 칸토어 집합  (4) 2022.03.03