본문 바로가기

CS ﹒ Algorithm/Baekjoon

JAVA백준 문제풀이 (2) 2922:벌집

 



글로만 쓰기 힘들어서 그림으로 가져왔다.

 

우선 해당 벌집을 각 층으로 나누었을 때 가장 큰 수가 1, 7, 19, 37 ,61인 것을 확인할 수 있다.

이 숫자는 각 1 -> 1 + (1*6) -> 1 + (1*6 + 2*6) -> 1 + (1*6 + 2*6 + 3*6) .. 으로 점점 커지고 있다.

 

그런데 1*6 + 2*6 + 3*6 + 4*6 + 5*6 ... 은 6 * (1 + 2 + 3 + 4 + 5 + 6 + ... )으로 치환할 수 있다.

1 + 2 + 3 + 4 + 5 + 6 + ... n ?

 

등차수열의 합

등차수열의 합을 구하는 공식은 위와 같이 정해져 있다.

우리는 수학자가 되려는 것이 아니기 때문에 그냥 공식에 대입해서 정답만 구하면 된다.

위 공식에 따르면 각 층의 최대값은 6 * ( 6 * ( n * (n+1) ) ) + 1이다.

그런데 함정이 있으니, 수열이 시작되는 층이 1층이 아니라 2층이라는 것이다. 따라서 n+1을 n-1로 바꿔준다.

 

// 이동 횟수를 입력하면 최대 방 번호를 알려주는 메서드 
    public static long calculator(int count) {
        long countSquared = (long)Math.pow(count,2);
        return (3 * countSquared) - (3L *count) +1;
    }

위에 적은 공식을 그대로 옮겨놓은 것이다. 해당 메서드에 이동 횟수를 인자로 넣으면 이동할 수 있는 최대 방 번호를 반환한다.

 

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in); // 사용자가 원하는 방 번호 입력
        int roomNum = scan.nextInt();
        int count = 0; // 이동 횟수 카운트
        if (roomNum == 1) { System.out.println(1); }
        // 입력값이 1일 경우 해당 공식에 위배되기 때문에 바로 1 출력
        if (roomNum != 1) {
        while ( calculator(count) < roomNum ) {
        // 위의 노트에 적혀있듯이 횟수는 이전층의 max보다 커야한다.
        // 따라서 계산 결과값(해당 층의 max)이 입력한 roomNum보다 작다면 다시 연산한다.
            count++;
        }
        System.out.println(count); }
    }

    public static long calculator(int count) {
        long countSquared = (long)Math.pow(count,2);
        return (3 * countSquared) - (3L *count) +1;
    }
}

이렇게 하면 끝.

굉장히 쉽게 푼 것처럼 적어놨지만 사실 수열이고 뭐고 아무것도 기억나는 게 없기 때문에 몸 비틀어가며 풀었다.

나.. 취업할 수 있겠지..? ㅎ

나처럼 나이 먹고 다시 공부한다고 고생하는 사람들 기죽지 말고 화이팅 ^^..~~~~