1부터 70까지 벌집 모양의 방이 있다.
1부터 시작해서 1씩 증가하면서 빙글빙글 6각형의 변에 방이 추가 된다.
입력값의 방까지 가는데 드는 비용을 요구하는 프로그램이다. 2~7은 1에 닿아있어서 자신을 포함해서 2개 방을 거친다.
8~19는 2~7을 감싸고 있어서 3의 비용이 든다. 이를 이용해서 풀면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import java.util.Scanner;
/*
* 1 //1
* 2~7 //2 6
* 8~19 //3 12
* 20~37 //4 18
* 38~61 //5 24
* 62~70 //6
*/
//baekjoon_2292_벌집
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int input = sc.nextInt();
int range=1; //처음에 1
int cnt=1;
int tmp=1;
while(true) {
if(range>= input) {
break;
}
tmp = 6 * (cnt++); //tmp 6 tmp 12 tmp 18 24 30
range += tmp; //렌 현 7 19 37 61 91
} //2 3 4 5 6
System.out.println(cnt);
}
}
|
cs |
/*
* 1 //1
* 2~7 //2 6
* 8~19 //3 12
* 20~37 //4 18
* 38~61 //5 24
* 62~70 //6
*/
1이 입력값으로 들어오면 출력도 그냥 1이다.
2~7이 1을 감싸고 있으므로 카운트는 2이고 2,3,4,5,6,7 6개의 방이 감싸고 있다.
2의 카운트를 세는 방의 범위는 2~7인 6이다.
2~7을 감싸는 방은 8~19내 이며 범위는 12 이다.
그 다음은 18 즉 6의 배수로 범위가 올라간다.
line 16 : 처음 출발인 1을 포함시키므로 range를 1로 잡는다. 범위에 따라 비용을 계산할 것이다.
line 17 : 방을 몇 개 거치는지 카운트할 변수.
line 18 : 입력값까지 도달할 때 까지 어느 범위에 속하는지 더해준다.
line 20, 21 : while문으로 루프를 돌리고 range가 input 보다 같거나 커지면 반복을 멈추고 빠져나간다.
입력값이 해당하는 범위 내로 들어간 것이다.
line 24 : 범위를 더할 것이다. cnt에 6을 곱하고 (처음에는 6..그다음 12..18) tmp에 넣는다. 그 후 cnt를 1 올려준다.
line 25 : tmp는 6이며 range (1)에 더해 range는 7이 된다. 카운트는 1올렸기에 2가 되었다.
만약 입력값이 2~7사이이면 break 조건문에 걸려서 while문을 빠져나가고 cnt(2)를 출력시키면 끝난다.
입력값이 8~19 사이면 다시 while문에 들어가서 cnt(2)에 6을 곱해 (12) 를 tmp에 넣고 range에 더한다.
range는 7+12 = 19가 되어 8~19가 입력값이면 break문에 걸려 빠져나가서 cnt(3)을 출력하고 종료시킨다.
입력값의 cnt가 몇이 될지 cnt를 계속 올리고 range 범위 값을 범위 그룹내에서 가장 큰 값까지 올려 비교 시키고 input보다 크면 종료시키는 것이다.
뭐 더 간단한 방법도 있겠지..?
'프로그래밍 > 백준 알고리즘 코드' 카테고리의 다른 글
백준 2869번 java 달팽이는 올라가고 싶다 (수학1) (0) | 2020.12.01 |
---|---|
백준 1193번 java 자바 분수찾기 [수학1] (2) | 2020.11.28 |
백준 2839번 java 자바 설탕배달 (수학 1) (0) | 2020.10.17 |
백준 1712번 java 자바 손익분기점 (수학 1) (0) | 2020.10.17 |
백준 1316번 자바 JAVA 그룹 단어 체커 [문자열] (0) | 2020.10.14 |
댓글