사용자 도구

사이트 도구


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()

토론

댓글을 입력하세요:
U O Q I L
 
ps/problems/boj/2292.txt · 마지막으로 수정됨: 2021/10/05 18:02 저자 teferi