[백준알고리즘] 2292번 벌집 (JAVA)
문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
예제
풀이
import java.util.*;
import java.lang.*;
import java.io.*;
class Main{
public static void main (String[] args) throws java.lang.Exception {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int room = 1; // 방
int range = 2; // 범위
while (true) {
if(n < range){ // n이 방 수보다 작을 경우 break
break;
} else {
range += 6*room; // 다음 범위의 최소값으로 범위 변경
room++; // 방 수 증가
}
}
System.out.print(room);
}
}
1번 / 1 / 1개
2번 / 2~7 / 6개
3번 / 8~19 / 12개
4번 / 20~37 / 18개 ... 이런 규칙이 적용된다.
이 문제의 규칙은 등차수열!
1. 벌집의 방 수와 범위 선언
2. while문으로 반복
입력한 값 n이 범위보다 작을 경우 break. n과 같으면 안됨!! 예를 들어 n이 1일 경우 범위 2보다 작기 때문에 while문을 빠져나간다.
그렇지 않을 경우(범위 안에 n이 있는 경우)
1) 방 1씩 늘리기
2) 하나의 조건이 끝나고 다음 방과 다음 방의 범위로 넘어가야하기 때문에 범위는 방에 6을 곱해주고, 원래의 범위 값도 같이 더해준다. range = range + 6*room. 즉 다음 범위의 최솟값으로 범위가 변경된다. 예를 들어 2번째 방일 경우 범위의 최솟값인 8이 range가 된다.
출처
2292번: 벌집
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌
www.acmicpc.net