본문 바로가기
Problem Solving/백준

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

by 청량리 물냉면 2021. 9. 1.
반응형
문제

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

 

2292번: 벌집

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

www.acmicpc.net

 

 

코드
#include<iostream>
using namespace std;

int main() {

	int room;
	int sum = 1;	//방 갯수 누적 합(no.1은 미리 카운트)
	int n = 2;	//거치는 방의 갯수(no.1은 미리 카운트)
	int cnt = 1;	//더한 수의 갯수(1은 미리 카운트해준다.)
	cin >> room;

	//입력받은 방 번호보다 누적 합이 커지면 반복문 종료
	while (sum < room) {	
		sum += (n - 1) * 6;
		n++;	
		cnt++;
	}

	cout << cnt;
	return 0;
}

 

 

코드 설명

출처: 백준 온라인 저지

알아보기 쉽도록 사진에 색을 입혀 패턴을 확인해 본다.

no 방 번호 방 갯수 거치는 방의 갯수
1 1 1 1
2 2 3 4 5 6 7 6 2
3 8 9 10 11 12 13 14 15 16 17 18 19 12 3
4 20 21 22 23 24 25 26 ... 36 37 18 4
5 38 39 40 41 42 43 44 45 46 ... 60 61 24 5

방의 갯수 = (거치는 방의 갯수 - 1) * 6 

(no. 1은 방의 시작점이므로 제외)

 

이 문제에서 요구하는 것은 거치는 방의 갯수이다. 

만약 사용자가 43을 입력했다면, 43이 되기 위해서는 1 + 6 + 12 + 18 + 6이 필요하다.

해당 식의 덧셈연산을 수행한 의 갯수가 바로 거치는 방의 갯수이다. 

 

이를 코드로 구현해 보면,

int room;
int sum = 1;
int n = 2;
int cnt = 1;

int room ☞  사용자에게 입력받을 방의 갯수

int sum = 1 ☞  방 갯수 누적 합(no.1은 미리 카운트)
int n = 2  ☞  거치는 방의 갯수(no.1은 미리 카운트)
int cnt = 1 ☞  더한 수의 갯수(1은 미리 카운트해준다.)

 

while (sum < room) {	
		sum += (n - 1) * 6;
		n++;	
		cnt++;
	}
	cout << cnt;

사용자에게 입력받은 방 번호가 누적 합보다 커지면 반복문을 종료한다. 

만약 사용자가 room에 43을 입력했다면, 누적합 계산은 43보다 작을 때까지 반복.

☞  sum = 1(sum기본 값) (반복문 시작)+ 6 + 12 + 18 + 24 = 61 (반복문 4회 진행 후 종료)

(반복문 다섯 번째 진행 시도 -> room(43)보다 sum(61)이 더 큰 수이므로 while문 종료)

☞  n = 2(기본 값) → (반복문 시작)3 → 4 → 5 → 6

☞  cnt = 1(기본 값) → (반복문 시작)2 → 3 → 4 → 5

   

반복문을 벗어났을 때의 변수값들

 

 

마무리

한 시간 동안 고민하던 걸 디버깅 한번으로 해결.

역시 갓디버깅...

비주얼 스튜디오 디버깅에도 익숙해지자.

 

 

↓디버깅 사용법 참고한 블로그

https://zapiro.tistory.com/entry/Visual-Studio-%EB%94%94%EB%B2%84%EA%B1%B0-%EC%82%AC%EC%9A%A9%EB%B2%95

 

Visual Studio 디버거 사용법 (Debugging)

오늘은 Visual Studio의 디버거 사용법을 익혀 보도록 해요 *디버깅(Debugging)이란? 디버깅 [ debugging ] 오류 수정. 컴퓨터 프로그램의 잘못을 찾아내고 고치는 작업. 일단 작성된 프로그램들이 정확한

zapiro.tistory.com


 

 

반응형