BOJ 2292 - 벌집 문제풀이
문제를 읽고 이해하기
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
재정의와 추상화
1번부터 시작하여 주어진 번호의 방으로 가는데, 최소 개수의 방을 지나서 가려면 1에서 시작하여 대각선으로 쭉 가는 방법 밖에 없다. 아래 그림이 그 예시가 된다.
위 그림과 같이 대각선으로 쭉 가는 거리를 알아내려면 중심인 1로부터 몇 칸 떨어져 있는지 알아내면 된다.
빨간색 영역에 있는 1이 있는 곳을 중심(=0)이라 한다. 그리고 그 주위를 둘러싸고 있는 방들을 1번째 영역이라고 한다. 또 그 1번째 영역을 둘러싸고 있는 방들을 2번째 영역이라고 한다.
이렇게 i번째 영역을 둘러싸고 있는 방들의 영역을 i+1번째 영역이라고 하고, i번째 영역에 있는 방들은 중심으로부터 i + 1만큼 떨어져 있는 것이 되므로 i + 1가 정답이 된다.
아래의 표를 보자.
중심(0) | 1번째 영역 | 2번째 영역 | 3번째 영역 | 4번째 영역 | 5번째 영역 |
1 | 6 | 12 | 18 | 24 | 30 |
1 | 1 + 6 = 7 | 7 + 12 = 19 | 19 + 18 = 37 | 37 + 24 = 61 | 61 + 30 = 91 |
첫 번째 줄은 각 영역에 있는 원소의 개수이고, 두 번째 줄은 중심부터 i번째 영역까지의 원소의 개수 합이다.
위 표를 통해 13번째 방이 있는 영역을 찾으면 7보다 크고 19보다 작거나 같은 2번째 영역이므로, 13번째 방은 중심으로부터 1 + 2 = 3만큼 떨어져 있으므로 답이 3이 된다.
코드 작성
#include <iostream>
using namespace std;
int main() {
int total = 1;
int i;
int n;
cin >> n;
for (i = 0; total <= 1000000000; i++) {
total += i * 6;
if (total >= n) break;
}
cout << i + 1;
return 0;
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
BOJ 12865 - 평범한 배낭(냅색 알고리즘) 문제풀이 (0) | 2020.04.09 |
---|---|
BOJ 10250 - ACM 호텔 문제풀이 (0) | 2020.04.08 |
BOJ 3053 - 택시 기하학 문제풀이 (0) | 2020.04.08 |
BOJ 2580 - 스도쿠 문제풀이 (0) | 2020.04.08 |
BOJ 1654 - 랜선 자르기 문제풀이 (0) | 2020.04.07 |
댓글
이 글 공유하기
다른 글
-
BOJ 12865 - 평범한 배낭(냅색 알고리즘) 문제풀이
BOJ 12865 - 평범한 배낭(냅색 알고리즘) 문제풀이
2020.04.09 -
BOJ 10250 - ACM 호텔 문제풀이
BOJ 10250 - ACM 호텔 문제풀이
2020.04.08 -
BOJ 3053 - 택시 기하학 문제풀이
BOJ 3053 - 택시 기하학 문제풀이
2020.04.08 -
BOJ 2580 - 스도쿠 문제풀이
BOJ 2580 - 스도쿠 문제풀이
2020.04.08