Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

jeongwon

[백준 JAVA] 2292번 - 벌집 본문

오늘의 문제

[백준 JAVA] 2292번 - 벌집

jeongwon_ 2022. 6. 19. 16:53

문제:

 

2292번: 벌집

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

www.acmicpc.net

 

수식 나열/조건 범위 (괄호 안의 숫자는 지나야 할 방의 개수 = 구해야 할 값) :

(1) : 1

(2) : 1 + 1   ~   1 + 6x1

(3) : 1 + 6x1 + 1   ~  1 + 6x1 + 6x2

(4) :  1 + 6x1 + 6x2 +   ~   1 + 6x1 + 6x2 + 6x3

.......

....

 

 

 

약식 순서도:

1) 값을 입력받아 변수에 저장한다. (BufferedReader, Integer.ParseInt(), int num)

2) check() 메소드를 호출한 결과값을 출력하고 메소드 종료. (public static int check(int num))

------메소드-----

(1) 개수(도달하는 데 걸리는 수)를 셀 변수와 최소, 최대값을 저장할 변수를 생성하고 각각 1을 저장한다. (int count, min, max)

(2) 매개변수로 받은 num 값이 1인 경우 메소드를 종료하고 count 값을 반환 (count = 1)

(3) 반복문 내에서 min 은 이전의 max 값보다 1씩 크다.

(4) max 는 반복할 때마다 6 x (n+1) 씩 증가한다. count값은 1씩 증가한다. 

(5) num 의 값이 각 범위 내에 속하면 메소드를 종료하고 count 값을 반환한다. 

 

 

 

 

답안: 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {
    
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 1)
		int num = Integer.parseInt(br.readLine());
		System.out.println(check(num)); // 2)

	}
    
	public static int check(int num) {
		int count = 1;	//(1)
		int min = 1; 
		int max = 1; 

		for(int i=0; i<num; i++) {
        
			if(num == 1) break;	//(2)
            
			min = max+1;		//(3)
			max += 6*(i+1);	//(4)
			count++;
            
			if(min <= num && num <= max) {	//(5)
				return count;
			}			
		}			 
		return count;		
	}
}

그리고.. 풀었다고 신나하면 안 되는 이유..

 

 

개선 답안 : (도움받은 곳: https://st-lab.tistory.com/73)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int num = Integer.parseInt(br.readLine());
		System.out.println(check(num));

	}
	public static int check(int num) {
		int count = 1;
		int range = 2; //min에는 2가 기본으로 더해진다. ( 1 + 6x1 + 1 )

		while(range <= num) { //범위는 입력값을 넘을 수 없다. 
			if(num == 1) break;
			range += 6*(count); //각 범위의 최소값으로 볼 수 있다. count를 활용..
			count++;		
			}				 
		return count;		
	}
}

메소드는 그대로 유지하고 수정해보았다. 보기에도, 성능면에서도 가벼운 코드가 됐다.