일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- precision
- 반복문
- 혁펜하임
- 혁펜하임AI
- C++ 백준
- 1463
- C++
- 백준
- 백준1026
- 혁펜하임강의후기
- 1로만들기
- 조건문
- c++ 기초
- 9095
- pytorch
- C++ 공백 입력
- tensorflow
- 백준9095
- 비교연산자
- 백준1463
- cuDNN
- AI강의
- 패스트캠퍼스
- for문
- AIDEEPDIVE
- 백준C++
- CUDA
- C++ 함수
- 패스트캠퍼스혁펜하임
- 혁펜하임강의
- Today
- Total
코딩하는 덕구 🐶
52. C++ 백준 2292 번 벌집 본문
안녕하세요! 코딩하는 덕구입니다!
벌집이 형성되는 규칙에 따라 벌집의 위치를 구하는 문제인 C++ 백준 2292 번 입니다~!
문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
https://www.acmicpc.net/problem/2292
2292번: 벌집
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌
www.acmicpc.net
#include <iostream>
using namespace std;
int main(){
int N, cnt = 2, i = 1;
cin>>N;
if(N == 1)
cout<<1;
else{
while(N>=cnt){
cnt += i*6;
i++;
}
cout<<i;
}
// 1 : 1
// 2~7 : 2
// 8~ 19 : 3
// 20~ 37 : 4
// 38~ 61
// 6, 12, 18, 24
return 0;
}
수학 단원을 들어가면서 이제 코딩 문법보다는 사고력이 중요해진것 같아요 ㅋㅋㅋ
저는 일단 규칙을 먼저 찾았습니다~!
밑에 주석 보이시죠 ㅋㅋㅋ 제가 문제 풀 때 적어놓은 것들인데
: (콜론) 앞 번호는 방 번호이고 뒷 번호는 입력된 벌집 까지의 최소 개수의 방입니다!
1번방은 1개, 2번 방부터는 2개, 8번 방 부터는 3개, 20번 방 부터는 거리가 4개
혹시 여러분들도 보이시나요?
2, 8, 20, 38
2 + (6*1) = 8
8 + (6*2) = 20
20 + (6*3) = 38
.
.
이제 규칙을 찾았으니 코딩해봅시다!
먼저 예외인 경우입니다! N이 1일때 최소 방의 개수는 1 이므로 1을 출력하는 코드를 작성했습니다!
if(N == 1)
cout<<1;
이후 나머지 case 에 대해서는 방의 범위별 최소 방 개수를 구하기 위해
전 방번호 + i*6
방번호는 2부터 시작합니다!
2 + 6*1 = 8
8 + 6*2 = 20
이렇게 가겠죠~!
else{
while(N>=cnt){
cnt += i*6;
i++;
}
cout<<i;
}
2~7번 방은 거리가 2 이고, 8~19 번 방은 거리가 3, 20~ 38번 방은 거리가 4
즉 거리는 i 값과 같죠!
N이 cnt(다음 거리까지의 방의 범위의 최소값) 일때 반복을 그만두고
i를 출력하면 됩니다~!
예를들어 입력이 13이면
while(13>= 2){ //첫 번째 반복
cnt = 2 + 1*6
1++;
}
while(13>= 8){ //두 번째 반복
cnt = 8 + 2*6
2++;
}
while(13>= 20){ //세 번째 반복
반복이 돌아가지 않음
}
i 는 3
즉 20보다 작은 13번째 방의 최소거리는 3이 출력됩니다!
이해가 잘 안되신다면 반복을 머리속으로 몇번 돌려보시면 이해가 잘 될겁니다!
C++ 백준 2292 번 이었습니다~! 감사합니다!
'알고리즘 문제 풀이' 카테고리의 다른 글
103. selection sort 선택 정렬 (0) | 2022.02.15 |
---|---|
102. 삽입 정렬 (0) | 2022.02.15 |
51. C++ 백준 1712 번 손익분기점 (0) | 2022.01.28 |
50. C++ 백준 1316 번 그룹 단어 체커 (0) | 2022.01.27 |
49. C++ 백준 2941 번 크로아티아 알파벳 (0) | 2022.01.27 |