알고리즘 문제풀이/백준

#2292 : 벌집

모항 2022. 4. 23. 19:57

풀이방법

사용된 것:

수학

 

2022.04.23

주어진 벌집은 다음과 같이 여러 개의 겹으로 인식할 수 있다.

안쪽으로부터 몇 번째 겹에 있느냐에 따라, 그 칸에 도착하기까지 거치는 칸의 수가 정해진다.

17은 3번째 겹에 위치하므로, 17이 입력값으로 주어졌을 때 올바른 출력값은 3이다.

따라서, 주어진 수가 몇 번째 겹에 위치하는지를 알아내는 알고리즘을 작성하면 된다.

 

1번째 겹에 속하는 수는 1개이다.

2번째 겹에 속하는 수는 6개이다.

3번째 겹에 속하는 수는 12개이다.

4번째 겹에 속하는 수는 18개이다.

...

n번째 겹에 속하는 수는 6$\times$(n-1)개이다.

 

이러한 규칙을 이용하여, 각 겹에서 가장 큰 수를 저장하는 정수 배열을 생성할 수 있다.

N의 최댓값이 1,000,000,000이고 18300번째 겹의 가장 큰 수가 1,004,615,101이므로, 나는 18300번째 겹까지만 저장하였다.

 

길이가 18300인 이 정수 배열을 완성하면 다음의 수들을 저장하게 된다.

1, 7, 19, 37, 61, ... 1004615101

 

N이 주어지면,

이 배열에 저장된 수들을 앞에서부터 차근차근 점검해나가면서

N보다 크거나 같은 수가 발견되면 그 수의 인덱스에 1을 더한 값을 즉시 화면에 출력하고 반복문을 종료하면 된다.

겹의 번호는 1부터 시작하지만 배열의 인덱스는 0부터 시작하므로 1을 더해주어야 한다.

 

코드

Java(2022.04.23)

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		
		//각 겹의 가장 큰 수를 arr에 저장하기
		int[] arr = new int[18300];
		arr[0] = 1;
		int sum = 1;
		for(int i = 1; i<18300; i++) {
			sum += 6*i;
			arr[i] = sum;
		}
		
		//정답 구하여 출력하기
		for(int i = 0; i<18300; i++) {
			if(arr[i]>=n) {
				System.out.print(i+1);
				break;
			}
		}
		
		sc.close();

	}

}

 

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#1449 : 수리공 항승  (0) 2022.04.28
#2108 : 통계학  (0) 2022.04.28
#1018 : 체스판 다시 칠하기  (0) 2022.04.21
#11866 : 요세푸스 문제 0  (0) 2022.04.21
#10816 : 숫자 카드 2  (0) 2022.04.19