일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 |
- 백준
- Ajax
- SWEA
- Git
- HTTP
- commited
- 응답코드
- SOCKET
- npm
- 타겟넘버
- JSP
- 17822
- 1868
- 달팽이는올라가고싶다
- staged
- boj
- JavaScript
- 카카오코드페스티벌
- GitHub
- 소형기관차
- graph
- Java
- 2869
- 알고리즘
- react
- web
- 17471
- 파핑파핑지뢰찾기
- 비동기
- node.js
- Today
- Total
devlog
[BOJ] 백준 2292 벌집-java 본문
문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
문제:https://www.acmicpc.net/problem/2292
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int num=in.nextInt();
int room=1,tmp=1;
for(int i=1; i<100000; i++) {
if(tmp<num && (tmp+=6*i)>=num) {
room +=i;
break;
}
}
System.out.print(room);
}
} |
cs |
풀이
벌집에서 입력받은 수가 몇개의 방을 지나야 하는지 알기 위해서 규칙을 찾아야 합니다.
숫자가 몇개의 방을 지나는지 알아보기 위해서 각 숫자가 지나는 방의 개수를 나열해봅니다.
1개의 방을 지나는 수 : 1 (1개)
2개의 방을 지나는 수 : 2~7 (6개)
3개의 방을 지나는 수 : 8~19 (12개)
4개의 방을 지나는 수 : 20~37 (18개)
5개의 방을 지나는 수 : 38~61 (24개)
이런식으로 각 범위에 해당하는 최대수를 나열하면 등차가 6의 배수인 계차수열 형태로 나옵니다.
각 범위의 최대 수를 기준으로 나열해보면 1, 7, 19, 37, 61... 인데 이것은 1, 1+6*1, 7+6*2, 19+6*3, 37+6*4 로 나타낼 수 있습니다.
a(n)=a(n-1)+6*(n-1)이라는 식을 얻을 수 있으므로 tmp라는 변수에 각 범위의 최대수를 넣어서 그 최대수와 이전항(이전범위 최대수) 사이에 속하는 수라면 n을 출력해주고 그것이 방의 개수가 됩니다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 백준 15954 인형들(카카오코드페스티벌)-java (1) | 2019.03.10 |
---|---|
[BOJ] 백준 10250 ACM호텔-java (395) | 2018.12.05 |
[BOJ] 백준 1193 분수찾기-java (350) | 2018.12.04 |
[BOJ] 백준 1924 2007년 -java (408) | 2018.11.23 |
[BOJ] 백준 15953 상금헌터(카카오코드페스티벌)-java (0) | 2018.11.23 |