2292번 벌집
Day8 8단계 20231026
풀이 1
- 해결 날짜 : 2023.10.27
- 다른 사람의 아이디어로 풀었다. 다음엔 내 아이디어로 풀어보자.
- 벌집에서 패턴 찾기
- https://st-lab.tistory.com/73
- 중앙 1번 방에서 떨어진 거리가 같은 방들의 번호를 묶어서 정리하면 특정 패턴이 보인다.
| 방 번호 | 떨어진 거리 |
|---|---|
| 1 | 0 |
| 2 ~ 7 | 1 |
| 8 ~ 19 | 2 |
| 20 ~ 37 | 3 |
| 38 ~ 61 | 4 |
| 62 ~ | 5 |
- 이 때 떨어진 거리가 1 증가하는 시작 방 번호들을 보면 2, 2+6, 8+12, 20 +18 ... 로, 이전 숫자에서 6*\n을 더한 값이 된다.
- 2를 초기값으로 두고, (2)+6*\1, (2+6) + 6*2, (2+6+12) + 6*3 ... 식으로 증가한다. 이걸 식으로 쓴다면 아래와 같다.
- 적절한 조건식을 넣어주면 무한루프를 끊고 방 번호를 얻을 수 있다.
int sum = 2; // 초기값
int count = 1; // 순번(곧 1번 방으로부터 떨어진 거리)
while (true) {
sum = sum + 6 * count;
count++;
}
- 입력으로 들어온 숫자가 1번 방으로부터 떨어진 거리가 바뀌는 때의 방 번호보다 크다면 그 숫자는 해당 떨어진 범위 내에 위치하고, 그 떨어진 거리가 입력 숫자 방까지 가는 최단 루트가 된다.
- 무한루프를 끊을 조건을 sum 이 입력 숫자 n보다 큰 시점으로 잡아야 한다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
if (n == 1) {
System.out.println(1);
return;
}
int sum = 2;
int count = 1; // 1번 방에서 1칸 밖으로 나간 범위부터 시작
while(true) {
if (sum > n) {
break;
}
sum = sum + 6 *count;
count++;
}
System.out.println(count);
br.close();
}
}
풀이 2
- 풀이 날짜 : 2025.05.22
- 약 1년 만에 부트 캠프에서 문제를 풀면서 다시 풀게 되었다.
- 이전과 방법은 동일하나 이번엔
while문이 아닌for문을 사용하였다. - 1번 방과 떨어진 거리를 그룹화했을 때 각각의 떨어진 거리 그룹의 마지막 방은
6*1+1=7,6*3+1=19,6*6+1=37로, 6에 곱해지는 숫자가1, 3, 6, 10, ..식으로 증가했다.- 이는 1부터 n까지 더한 합과 동일하다.
- 따라서
입력값/6으로 루프의 마지막 위치(1번 방과 떨어진 거리의 최대치)를 정할 수 있으며, 입력값이 거리 범위가 바뀌는 두 방 사이 안에 오는지 확인하여 1번 방으로부터 떨어진 거리를 알 수 있다.
import java.io.*;
public class Main {
public static void main(String[] args) {
BufferedReader reader;
try {
reader = new BufferedReader(new InputStreamReader(System.in));
int roomNumber = Integer.parseInt(reader.readLine());
int sum = 0;
for(int i = 0; i <= roomNumber/6 + 1; i++) {
sum += i;
int end = 6 * sum + 1;
if (end >= roomNumber) {
System.out.println(i+1);
return;
}
}
} catch (Exception e) {
}
}
}