ps:problems:boj:2292
벌집
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 2292 |
문제명 | 벌집 |
레벨 | 브론즈 2 |
분류 |
수학 |
시간복잡도 | O(1) |
사용한 언어 | Python |
제출기록 | 29200KB / 72ms |
최고기록 | 56ms |
해결날짜 | 2021/10/04 |
풀이
- 간단한 수학문제
- 거리가 1인 칸이 1개인것만 제외하면, 거리가 2인 칸은 6개, 3인 칸은 12개, 4인 칸은 18개.. 이렇게 거리가 x인 칸의 갯수는 6(n-1)개이다.
- 그래서 거리가 x이하인 칸의 갯수는 1 + sigma(6*(i-1)) = 1 + 3*x*(x-1) 개.
- 결국 풀이는 1+3*x*(x-1) 가 n이상이 되는 가장 작은 x를 찾으면 된다.
- 그냥 x를 1부터 증가시키면서 계산해보는 O(sqrt(n)) 알고리즘으로도 충분히 풀리기는 한다.
- 그러나 그냥 수식을 조금만 전개하면 계산식을 바로 구할수 있다. 1+3*x*(x-1) >= n > 1+3*(x-1)*(x-2) 에서 우측 부분을 정리하자
- $n \geq 2+3(x-1)(x-2)$ 로 바꿔쓰고, 오른쪽을 완전제곱식형태로 만들면 $ \frac{(n-2)}{3} + \frac{1}{4} \geq (x-\frac{3}{2})^2$ 이 되므로 $x \leq \sqrt{\frac{(n-2)}{3} + \frac{1}{4}} + \frac{3}{2}$ 가 된다. 다시 정리하면 $x=\lfloor\frac{\sqrt{12n-15}+9}{6}\rfloor$. n이 1일때는 따로 처리해야 한다는 것만 신경쓰자.
- 이렇게 계산하면 O(1)에 해결 가능.
코드
"""Solution code for "BOJ 2292. 벌집".
- Problem link: https://www.acmicpc.net/problem/2292
- Solution link: http://www.teferi.net/ps/problems/boj/2292
"""
def main():
N = int(input())
print('1' if N == 1 else int(((12 * N - 15)**0.5 + 9) / 6))
if __name__ == '__main__':
main()
ps/problems/boj/2292.txt · 마지막으로 수정됨: 2021/10/05 18:02 저자 teferi
토론