글 작성자: 취업중인 피터팬
728x90

https://www.acmicpc.net/problem/2292

 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌

www.acmicpc.net

 

문제가 조금 어려워 보이지만 천천히 생각하면 무엇을 원하는지 금방 알 수 있습니다.

각 숫자는 1부터 바깥 테두리 형식으로 증가하면서 숫자가 이루어져 있습니다.

그리고 주어진 숫자가 몇번째 테두리에 있는지 물어보는 문제입니다.

(여기서 테두리란 각 도형의 바깥을 감싸는 도영을 의미합니다. 밑에 두꺼운 글씨를 보시면 이해가 더 잘 되실 겁니다.)

 

1은 첫번째 테두리에 2 ~ 7은 2번째 테두리에 8~19는 3번째 테두리에 20~37는 4번째 테두리에 있습니다.

여기까지 오셨다면 문제 이해는 끝나신 겁니다.

결국 내가 원하는 숫자가 몇번째 테두리에 있는지를 물어보는 문제임으로 테두리의 번호를 출력하는 것이 목적입니다.

 

정리하자면 

입력 : 원하는 숫자

~계산식~

출력 : 원하는 숫자가 있는 테두리번째

 

여기서 문제가 있습니다. 테두리의 개수가 증가한다는 겁니다. 테두리의 개수가 일정하다면 그냥 반복문으로 입력한 수만큼 돌려서 개수만큼 나눠버리면 될 듯한데요.

어떻게 하면 점점 늘어나는 테두리의 내가 입력한 숫자가 몇번째 테두리에 있는지 알 수 있을까요?

제가 생각한 이 문제의 핵심은

무한 루프 - while(true)

등차 수열 공식 - an = a1 + (i-1)d

입니다.

 

일단 정답 부터 본 후에 설명하겠습니다.

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int count = 1;
		int i = 1;
		while(true) {
			int a = 6 + (i-1)*6;
			for(int j = 0; j < a; j++) {
				count++;
			}
            if(n == 1){
                i = 0;
                break;
            }
			else if(count >= n) {
				break;
			}else {
				i++;
			}
		}
		System.out.println(i+1);
    }
}

 

*코드 설명

 

먼저 숫자를 입력받습니다.

테두리 숫자를 구할 count을 0으로 초기화 합니다.

테두리 번째를 구할 i를 1로 초기화 합니다.

int n = sc.nextInt();
int count = 1;
int i = 1;

 

while(true)로 무한 반복을 해줍니다. count가 입력받는 숫자보다 크거나 같으면 break로 빠져나갑니다. break로 빠져나간 후에 해당 테두리가 몇번째(i)인지 출력해주면 됩니다.

while(true) {
			
            //등차수열 공식
            
			else if(count >= n) {
				break;
			}else {
				i++;
			}
		}
		System.out.println(i+1);

이제부터가 중요합니다. 테두리의 개수는

1, 6, 12, 18, 24...로 점점 늘어납니다. 다행이 여기에는 규칙이 있습니다. 1->6으로 갈때 빼고는 모두 6씩 늘어난다는 점입니다.

등차수열 공식이 기억 나시나요? 저도 5년전에 배웠던 공식이라 가물가물 하더라고요. 이번 문제의 등차수열 공식은

첫 수열(6) + (수열의 순서 - 1)*증가 값(6) = 다음 수열 값

입니다. 첫번째 1일때를 제외하고 저 공식으로 각 테두리의 마지막 값을 구할 수 있습니다. 마지막 수만큼 count를 늘려주면 되니깐요

수열의 순서가 결국에는 저희가 원하는 출력값이 되게 됩니다.

그리고 첫번째 수열을 제외 했음으로 마지막에 출력할 때 +1과 n값이 1일때를 예외처리 해주면 정답을 얻을 수 있습니다.

int a = 6 + (i-1)*6;
for(int j = 0; j < a; j++) {
		count++;
	}
if(n == 1){
    i = 0;
    break;
}