문제

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
(구상)
다음그림처럼 1에서부터 1칸씩 멀어질수록 규칙을 가진다.
2칸 떨어진 수들 2~7 (6개)
3칸 떨어진 수들 8~19 (12개)
4칸 떨어진 수들 20~37 (18개)
5칸 떨어진 수들 38~61(24 개)
n칸 멀어질때 마다 6*(n-1) 을 하게 된다.
1인경우만 따로 주고 나머지의 경우에는 다음의 규칙을 적용하여 바운더리를 설정해 줘서 풀어보겠다.
range =2
range = range+(6*cnt);
라고 준다고 하면
range | 2 | 8 | 20 | 38 | 62 |
cnt | 1 | 2 | 3 | 4 | 5 |
이런식으로 되서 떨어진 칸들을 바운더리로 했을떄의 range 는 각각의 범위의 첫값 이 된다.
package codingTest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Algorithm18 {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
int range = 2;
int cnt = 1;
if (n == 1) {
System.out.println(1);
} else {
while (range <= n) {
range = range + (6 * cnt);
cnt++;
}
System.out.println(cnt);
}
}
}
'JAVA > JAVA Algorithm' 카테고리의 다른 글
[백준] 2675번 문자열 반복 (0) | 2022.09.05 |
---|---|
[백준] 11720번 숫자의 합 (0) | 2022.08.31 |
[백준] 1110번 더하기 사이클 (0) | 2022.08.29 |
[백준] 2884번 알람시계 (0) | 2022.08.28 |
[백준] 18258번 큐2 (0) | 2022.08.28 |