백준

백준 2292: 벌집(java/C)

unhyepnhj 2024. 7. 6. 18:23

문제

 

풀이

 

중심(1)으로부터 떨어진 바퀴 수? 에 따라 나눌 수 있다

중심을 0번째라고 하면 2~7은 1바퀴째, 8~19는 2바퀴째... 이런 식으로

정리하면 아래와 같습니다.

같은 구간에 속하는 방들끼리는 1번 방에서부터의 경유 방 개수(이하 거리라 하겠음)가 동일하고(원-반지름 개념으로 생각하셔도 괜찮을 듯)

각 구간에 속하는 방 수는 다음 바퀴로 넘어갈 때마다 6개씩 증가한다.

 

  • 같은 구간에 속하는 방은 중심에서부터 거리가 동일
  • 구간이 바뀔 때마다 거리가 1씩 증가

이 둘을 이용해 풀이할 수 있다.

int count=1;	//중심일 때 거리 1
int ran=2;	//구간 최솟값 시작: 2

if(N==1)
	System.out.println(1);
else{
    while(ran<=N){	//N이 속한 구간에 도달할 때까지 반복
        ran=ran+(count*6);	//새로운 구간 최솟값=지난 구간의 최솟값+지난 구간의 거리
        count++;	//구간이 바뀌었으므로 거리 1 증가
    }
}

 

N이 1일 때는 1을 출력하면 되고, 1이 아닐 경우에는  N이 속한 구간까지 반복하며 count를 증가시킨다

 

[JAVA]

Scanner 대신 BufferedReader를 사용하였다

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		
		int count=1;	//방 개수
		int ran=2;
		
		int N=Integer.parseInt(in.readLine());
		
		if(N==1)
			System.out.println(1);
		else {
			while(ran<=N) {
				ran=ran+(count*6);
				count++;
			}
			System.out.println(count);
		}
	}
}

 

 

[C]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int count = 1;
	int ran = 2;

	int N;
	scanf("%d", &N);

	if (N == 1)
		printf("%d", 1);
	else {
		while (ran <= N) {
			ran = ran + (count * 6);
			count++;
		}
		printf("%d", count);
	}
	return 0;
}