https://www.acmicpc.net/problem/2292
문제내용은 아래 더보기를 누르면 나온다.
알고리즘
육각형으로 이루어진 방들이 중앙의 1번부터 시작해서 이웃하여 퍼져나간다.
숫자 N은 1,000,000,000 이하까지 주어진다.
1에서 N번방까지 최소 몇 개의 방을 지나가는지 시작과 끝을 포함하여 출력하면 된다.
예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
위 이미지 오른쪽에 숫자에 따른 거리를 한 줄씩 표시했는데 +6 단위로 거리가 1씩 늘어난다.
- 1개 : 1
- 2개 : 2 ~ 7 (+6)
- 3개 : 8 ~ 19 (+12)
- 4개 : 20 ~ 37 (+18)
- 5개 : 38 ~ 61 (+24)
- ..........
위 같은 규칙성을 보이므로 1일 때의 조건을 따로하고, 2부터 시작하면 될 듯 하다.
즉, if( N == 1 ) 일때와 아닐때로 처음에 구분하는 것이다.
범위는 2부터 시작하여 +6씩 1거리가 늘어난다.
1 거리가 늘어날때마다 +6을 하던 값에 +6을 해줘서 다음번은 +12를 해준다. 그 다음번은 +18이다.
거리를 count, 범위를 range로 했을 때, range는 2부터 시작하는 것이다.
range = range + (6 * count);
count++
즉, 한 번 돌때마다 위와 같은 공식이 성립하게 된다.
1. 숫자 N을 입력받는다.
2. 거리 count = 1, 범위 range = 2로 생성한다.
3. 만약 N이 1이면 "1"을 출력한다.
4. 아니라면 range가 N 이상이 될때까지 반복한다.
4-1. range를 +(6*count) 해준다.
4-2. count++ 한다.
5. 반복이 끝나고 count를 출력한다.
풀이1
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class No_2292 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int count = 1; // 거리
int range = 2; // 범위
if (N == 1) {
System.out.println(1);
} else {
while (range <= N) {
range = range + (6 * count);
count++;
}
System.out.println(count);
}
}
}
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 3003번 - Java(자바) (0) | 2022.03.14 |
---|---|
[백준] 1712번 - Java(자바) (0) | 2022.03.07 |
[백준] 1316번 - Java(자바) (0) | 2022.03.05 |
[백준] 2941번 - Java(자바) (0) | 2022.03.02 |
[백준] 5622번 - Java(자바) (0) | 2022.02.27 |