[백준] 2292번 : 벌집 - Java(자바)

이정우·2021년 9월 12일
0

백준

목록 보기
16/32

이번 문제는 벌집 이동 문제였습니다. 문제를 이해 설명은 사진으로 대체하겠습니다.
이번에는 2가지 방법으로 풀어봤습니다.

Step 0. 해답 코드 (배열 생성 후 확인)

import java.util.Scanner;
public class Hive_2292 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int count = 1; //배열 속 숫자 
		int[] bee = new int[18258];
		bee[0] = 1;
		for (int i = 1; i < 18258; i++) {
			count = count + 6 * i;
			bee[i] = count;
		}		
		int n = sc.nextInt();
		for (int i = 0; i < bee.length; i++ ) {
			if (n == 1) {
				System.out.println(1);
			}
			if (n > bee[i] && n <= bee[i + 1]) {
				System.out.println(i + 2);
			}
		} 
		
	}

}

Step 0_1. 해답 코드 (배열 없이)

package Basic_Math;

import java.util.Scanner;

public class Hive2_2292 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int count = 1; // 배열 속 숫자
		int n = sc.nextInt();
		for (int i = 1; i < 18258; i++) {
			count = count + 6 * i;
			if (n == 1) {
				System.out.println(1);
				break;
			}
			else if (count >= n) {
				System.out.println(i + 1);
				break;
			}

		}

	}

}

문제 설명 전 이번에는 2가지 방식으로 풀었습니다. 처음에는 배열에 숫자를 집어넣고 확인하는 방법과 두 번째는 배열 없이 풀었습니다. 결국은 같은 방식인데 저렇게 나눈 이유는 제가 문제만 보고 바로 수식이 안떠올라서 일단 숫자를 저장해서 만들어보고 그걸 토대로 두 번째 방법으로 풀었습니다. 즉, 1번째 코드를 통해 생각을 정리하고 식을 만든 후 두 번째 코드로 발전하였습니다.

Step1. 문제 접근

그림을 보면 아실 수 있듯이 벌집의 숫자는 1 -> 7 -> 19..이렇게 증가하고 있고 그 증가 범위는 6의 배수입니다. 이 부분을 이용하여 조건식을 세워 문제를 풀었습니다.

Step 2. 문제 풀이

미리 계산을 통해 벌집의 숫자가 10억을 기준으로 가장 큰 숫자는 18258칸이라는 것을 도출해낸 상태로 풀었습니다.

  1. 첫 방식에서는 18258칸의 숫자 배열을 만든 후 해당 칸마다 최대 수를 집어넣어 줬습니다.
int[] bee = new int[18258];
		bee[0] = 1;
		for (int i = 1; i < 18258; i++) {
			count = count + 6 * i;
			bee[i] = count;
		}		
  1. 그 후 입력 받은 숫자가 현재 배열보다는 크면서 다음 칸의 배열보다는 작은 위치를 찾아서 해당 배열의 위치 + 2를 프린트 해줬습니다. 1일 경우에는 따로 프린트 해주었습니다.
int n = sc.nextInt();
		for (int i = 0; i < bee.length; i++ ) {
			if (n == 1) {
				System.out.println(1);
			}
			if (n > bee[i] && n <= bee[i + 1]) {
				System.out.println(i + 2);
			}
		} 

1_1. 두 번째 방법은 첫 번째 방법에서 이미 값들을 확인 했으므로 배열을 따로 안 쓰고 바로 조건식을 줘서 풀었습니다.

for (int i = 1; i < 18258; i++) { // 최대칸까지(첫 칸은 1만 존재해서 if로 빼주므로 조건은 18259가 아닌 18258) 반복문으로 확인 
			count = count + 6 * i;  //벌집의 각 줄에서 가장 큰 값 (7, 19, 37, 61..)
			if (n == 1) { //1일 경우 바로 값 도출
				System.out.println(1);
				break;
			}
			else if (count >= n) { // 계산을 통해 얻어진 count값이 입력 받은 값보다 크거나 같아지는 순간을 찾아서 값 도출.즉 , 저 입력된 값은 저 범위 안에 존재한다.
				System.out.println(i + 1); //첫 칸을 제외했으므로 + 1
				break;
			}
		}

Step 3. 느낀 점

이번 문제는 다른 바로 얼마전에 풀었던 문제보다는 빠르게 풀 수 있었고 수학적 사고를 기르는데 도움이 됐던거 같습니다! 따로 큰 문제 없이 풀 수 있었고 재미도 있었던 문제였습니다.

출처 : 백준 2292번 https://www.acmicpc.net/problem/2292

profile
프로그래밍 공부 중!

0개의 댓글