본문 바로가기
Tech/Algorithm

백준)Q.2292_벌집

by 소라소라잉 2019. 4. 12.

문제

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

 

입력

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

 

출력

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

 

예제 입력

13

예제 출력

3

 

<나의 풀이>

import java.util.*;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
int n = 0;
long fn = 1;
boolean check = true;
while (check) {
if (input <= fn) {
n++;
System.out.println(n);
check = false;
}
else if (input > fn) {
n++;
fn = fn + (6 * n);}
}

} // end of main

}


'규칙 찾기'에 있는 문제다. 다른 규칙찾기 문제보다는 비교적 쉬운 편에 속한다.
가만 보면 벌집1을 둘러싼 벌집 원의 원소들 갯수는 6의 배수로 늘어나고 있으며 input이 어느 숫자든 input이 포함된 원이 1에서부터 몇번째 원인지만 알면 된다.
input = 1은 1부터 계산하기 때문에 2,3,4,5,6,7 이 있는 원에 포함된 숫자는 2번째.
그 다음 원(8,9,10,11,12,13,14,15,16,17,18,19)에 포함된 숫자는 3번째.

fn은 각 원의 원소들의 최대값을 넣는 변수이다.


테스트케이스로 알고리즘을 보자면

input = 13.

첫번째 Turn)
if-input값(13)이 fn(1)보다 작은가? -> no
else if-input값(13)이 fn(1)보다 큰가? -> yes
n++ (몇 번째 원인지 카운트 해주는 변수. 1이 됨)
fn = 1 + ( 6 * n(1)) = 7

두번째 Turn)
if-input값(13)이 fn(7)보다 작은가? -> no
else if-input값(13)이 fn(7)보다 큰가? -> yes
n++ (2가 됨)
fn = 7 + ( 6 * n(2)) = 19

세번째 Turn)
if-input값(13)이 fn(19)보다 작은가? -> yes
n++ (3이 됨)
n 출력 후 check 를 false로 바꾸며 반복문 탈출.

 

 

댓글