Contents

[백준 2292]벌집 - JAVA 풀이

   Aug 17, 2021     2 min read     - Comments

바로가기

문제

문제


해석

  • 1번 방부터 숫자 N번 방 까지 몇번의 문을 거쳐야하는지 구하는 문제

풀이

문의 수123456
방번호1719976191
 612182430

위와 같은 규칙성이 보인다.


코드 1

  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;
    }
}