책 읽다가 코딩하다 죽을래

[JAVA] 백준 2292번 : 벌집 문제 풀이 본문

코딩/알고리즘문제

[JAVA] 백준 2292번 : 벌집 문제 풀이

ABlue 2021. 1. 8. 00:09

www.acmicpc.net/problem/2292

 

2292번: 벌집

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

www.acmicpc.net

 

위 문제의 정답이다.

코드에 대해 설명하기 전에 일단 이 문제에 규칙부터 알아가야한다.

빨간 선은 1을 중심으로 해서 각각의 두께를 나타낸 것이며, 파란색 원은 그 두께에서 가장 큰 수를 나타낸 것이다.

1번부터 N번 방까지 최소 몇개의 방을 지나는 것을 알기 위해서는 일단 각각의 두께마다 가장 큰 수가 몇인지를 알아야한다.

첫번째 두께는 1이 가장 큰 수이다.

두번째 두께는 7이 가장 큰 수이다.

세번째 두께는 19가 가장 큰 수이다.

네번째 두께는 37이 가장 큰 수이다.

다섯번째는 61이 가장 큰 수이다.

 

1 -> 7 -> 19 -> 37 -> 61 -> ... 로 점점 수가 커진다. 

이 수열의 규칙은 다음과 같다.

 

1 -> 1 + 6 -> 1+ 6 + 12 -> 1+ 6 + 12 + 18 -> 1+ 6 + 12 + 18 + 24 -> ...

 

이런 식으로 1부터 시작해서 6의 배수만큼 계속 더해져 나가는 것이다.

N의 값이 주어지면

1에 속하면 1 개의 방만 지나가면 된다.

(1+1) ~ (1+6)에 속하면 2 개의 방만 지나가면 된다.

(1+6+1) ~ (1+6+12)에 속하면 3 개의 방만 지나가면 된다.

(1+6+12+1) ~ (1+6+12+18)에 속하면 4 개의 방만 지나가면 된다.

(1+6+12+18+1) ~ (1+6+12+18+24)에 속하면 5 개의 방만 지나가면 된다.

 

이런 규칙이 존재하는 것이다.

이런 규칙을 기반으로 코드를 짜면 이런 식으로 나온다.

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		int N  = scan.nextInt();
		int output = 1, compare = 1;
		while(compare < N) {
			compare += (output * 6);
			output++;
		}
		System.out.println(output);
	}
}