2018년 10월 15일 월요일

[백준] 2292 벌집


   요약
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

INPUT
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.

OUTPUT
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.




   소제목

우선 그림을 단순화시키며 규칙을 찾았다.
규칙을 찾으니 원의 범위가 1, 6, 12, 18,... 으로 개수가 늘어났다. 개수가 늘어난 거니까 범위는 1, ~7, ~19, ~37,...로 늘어났다.

이때, 간단히 하나씩 빼가면서 i를 늘려가면서 계산하면 값을 알아낼 수 있을 것 같았는데, 음.. 어느 부분의 반례를 생각하지 못한건지 모르겠다.

그래서 범위의 최댓값들 1, 7, 19,...들을 입력값과 비교하여 어느 범위에 속하는지 알아내는 것으로 구현했다.

* 값이 갱신되는 반복문을 통해 답을 구하고자 할 때, 갱신되는 값은 따로 변수를 두는 것이 정확한 답을 구하는 데 효과적이다.

#include <stdio.h>
int main() {
 int n, i=1, sum=1;
 scanf("%d", &n);
 while(n > sum) {
  sum += i*6;
  ++i;
 }
 printf("%d", i);
}

댓글 없음:

댓글 쓰기