
난이도: ★★★★☆ • solved on: 2025-07-06

자료구조
알고리즘/기법
핵심 키워드
- 문제 분해
- 각 층에서 추가되는 방의 수는 6의 배수로 증가(6, 12, 18, …).
- n번 방이 몇 번째 층에 포함되는지 반복문으로 찾는다.
- 핵심 로직 흐름
1. n = 1이면 바로 1 리턴 2. 각 층의 범위(3*i*(i-1)+1)에 대해 n이 어디에 속하는지 i를 1부터 증가시키며 찾기- 예외 처리
- n = 1일 때: 바로 1 출력
import java.io.*;
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.print(1);
}
for(int i = 1; i <= n; i++){
if(n<=3*i*(i-1)+1&&n>3*(i-1)*(i-2)+1) {
System.out.print(i);
break;
}
}
}
}
- 문제 분해
- 벌집의 각 층의 마지막 번호는
1 + 6 × (1+2+...+(k-1)) = 3k(k-1)+1- 이 식을 k에 대해 풀면, 주어진 n에 대해 최소 k를 빠르게 찾을 수 있음
- 핵심 로직 흐름
1. k에 대해 3k^2 - 3k + 1 >= n 을 만족하는 최소 k를 찾는다. 2. 수학적으로 풀면 k = ceil((sqrt(12*(n-1)+9)-3)/6)- 예외 처리
- n = 1일 때는 바로 1 리턴
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 k = (int)Math.ceil((Math.sqrt(12 * (n-1) + 9) - 3) / 6);
System.out.println(k);
}
}
방법 1 :
- 시간 복잡도: O(√N) (i가 빠르게 커짐)
- 공간 복잡도: O(1)
방법 2 :
- 시간 복잡도: O(1) (수식 한 번 계산)
- 공간 복잡도: O(1)
계차수열 (階差數列)
각 항들 사이의 '차'로 이루어진 수열(즉, 차분(差分) 수열)이 등차수열이 되는 수열을 말함. 즉, 앞뒤 항의 차들이 일정하게 증가(또는 감소)하는 패턴.
- 대표 예시:
1, 7, 19, 37, 61, ...
(각 항의 차이: 6, 12, 18, 24, ... → 6씩 증가)
비슷한 유형 (GPT 추천):
확장 문제 (GPT 추천):