오늘은 백준에서 2292번 - 벌집 문제를 풀어봤다.
문제 자체는 단순한 수학 규칙 문제인데, 벌집의 패턴이 꽤 흥미로웠다.
https://www.acmicpc.net/problem/2292

처음엔 대충 벌집이 육각형 형태로 퍼진다는 건 알았지만,
구체적으로 몇 개씩 늘어나는지 잘 모르겠어서 손으로 적어봤다.
1단계: 1
2단계: 2~7 (6개)
3단계: 8~19 (12개)
4단계: 20~37 (18개)
...
이렇게 6의 배수로 방 개수가 늘어난다.
즉, 중심에서 한 칸씩 멀어질수록 6, 12, 18, 24... 이런 식으로 방이 추가된다.
방 번호 n이 주어졌을 때, 최소 몇 개의 방을 지나야 하는지를 구하는 문제다.
처음에는 어떤 수학공식이나 누적합을 써야 하나 싶었는데,
사실상 그냥 단순 반복문으로 충분히 해결된다.
int n = int.Parse(Console.ReadLine());
int count = 1; // 지나야 할 최소 방 개수 (1부터 시작)
int range = 1; // 현재 범위의 최대 방 번호
while (range < n)
{
range += 6 * count;
count++;
}
Console.WriteLine(count);
입력: n = 20
반복문을 돌면서 범위를 확장해보면:
range = 1 count = 1 → 아직 20보다 작음
range = 7 count = 2 → 아직 작음
range = 19 count = 3 → 아직 작음
range = 37 count = 4 → 여기서 멈춤 (range >= n)
즉, 20번 방에 도달하려면 최소 4개의 방을 지나야 한다.
출력은 4.
처음엔 range랑 count를 1로 잡고 while문을 돌린다는 게 좀 낯설었는데,
생각해보면 n = 1이면 애초에 while문을 안 타니까 바로 1 출력이 되는 구조다.
별거 아닌 반복문 하나로 이런 규칙을 표현할 수 있다는 게 꽤 재밌었다.
벌집은 중심에서 6의 배수로 확장된다.
range는 현재 범위의 끝 방 번호
range < n일 때만 범위를 확장하고, range >= n이 되면 종료
그때의 count가 곧 답이다