중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는가.
해당 수가 몇 레벨에 존재하는 지를 알아야 한다.
1 → 1 레벨
2 ~ 7 → 2 레벨
8 ~ 19 → 3 레벨
20 → 37 → 4 레벨 이런 식으로 증가하고 있다. N = 13 이면 3 레벨에 존재하기 때문에 답은 3이다. 그리고 N = 58이면 5 레벨에 있기 때문에 답은 5이다.
육각형으로 증가하는데 1 레벨은 길이가 1인 육각형, 2 레벨을 길이가 2인 육각형이다.
3 레벨은 3*6 - 6이다. 즉 해당 레벨에 존재하는 칸의 개수는 6 * (X - 1) 단, X = 1 이면 1이 된다.
2 계층은 6개 3 계층은 12개가 존재한다.
마지막 번호도 규칙이 있다.
1번 레벨 : 1
2번 레벨 : 7
3번 레벨 : 19
4번 레벨 : 37
이렇게 된다. 즉 이전 마지막 번호 + (6 * (X-1))이다.
이제 주어진 N이 어느 범위인지 판단하면 된다. 마지막 숫자보다 작으면 가능한 후보이며 마지막 숫자보다 큰 순간이면 바로 이전 레벨이 답이다.
package boj;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ2292 {
static FastReader scan = new FastReader();
static int N;
static void input() {
N = scan.nextInt();
}
static void solve() {
int level = 2;
int end = 1;
while (end < N) {
end += 6 * (level - 1);
level++;
}
System.out.println(level - 1);
}
public static void main(String[] args) {
input();
solve();
}
static class FastReader {
BufferedReader br;
StringTokenizer st;
public FastReader() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreTokens()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
}
'Algorithm > BOJ' 카테고리의 다른 글
BOJ 6087 - 레이저 통신 (0) | 2024.11.07 |
---|---|
BOJ 10021 - Watering the Fields (0) | 2024.11.06 |
BOJ 2933 - 미네랄 (0) | 2024.11.05 |
BOJ 15591 - MooTube (Silver) (0) | 2024.10.31 |
BOJ 10830 - 행렬의 제곱 (0) | 2024.10.31 |