[백준 2292]벌집 - JAVA 풀이
바로가기
문제
해석
- 1번 방부터 숫자 N번 방 까지 몇번의 문을 거쳐야하는지 구하는 문제
풀이
문의 수 | 1 | 2 | 3 | 4 | 5 | 6 |
방번호 | 1 | 7 | 19 | 97 | 61 | 91 |
차 | 6 | 12 | 18 | 24 | 30 |
위와 같은 규칙성이 보인다.
코드 1
- 반복문이 사용하기 싫어서 한번에 답을 얻고자 이차방정식의 근의 공식을 사용하였다.
- 근의 공식
$-b\pm\sqrt{b^2-4ac}/2a$
- 이차 다항식
$y=3x^2-3y+1$
$y=3+\sqrt{9+12(x-1)} / 6$
x = 7 이 면, y = 2이다. 1 < x < 7 이 면, 1.xxxx가 나오게 된다. 실수가 나오면 int형으로 변형하여 +1을 해준다. y가 정수형이 나와도 +1 하게 되므로 x가 아닌 x-1을 입력해준다.
- 문제점
입력값이 적으면 계산이 되는데 6억 이상의 값이 입력되면 계산이 안되서 오류가 난다.
import java.io.*;
public class Main
{
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int x = Integer.parseInt(br.readLine());
bw.write((int)((3 + Math.sqrt(9+12*(x-2))) / 6) + 1 + "");
bw.flush();
bw.close();
}
}
코드 2
import java.io.*;
public class Main
{
public static void main(String args[]) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
bw.write(calc(n) +"");
bw.flush();
bw.close();
}
public static int calc(int n){
if(n == 1) //1은 예외 처리
return 1;
int count = 1, sum = 1;
while(n > sum){
sum = sum+(count*6); //계차수열의 등차가 6
count++;
}
return count;
}
}