https://www.acmicpc.net/problem/2292
문제
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
풀이
이 숫자들은 각 최소 거리가 같다. (특정한 길이에서의 최소길이 = 원 이라는 아이디어에서 파생)
범위 | 방의 최소 개수 | 숫자의 개수 |
2~7 | 2 | 6(6*1) |
8~19 | 3 | 12(6*2) |
20~37 | 4 | 18(6*3) |
38~61 | 5 | 24(6*4) |
62~91 | 6 | 30(6*5) |
범위(등비수열,등차수열 )
3n(n+1) + 2 | 3n(n+1) + 2 +6n +5 |
방의 최소 개수: n+2
정답코드
#include <stdio.h>
int main() {
int N;
scanf("%d", &N);
for (int n =0; n*(n+1) < 1000000000; n++)
{
int a = 3*n*(n + 1);
if (N == 1)
{
printf("%d", N);
break;
}
if ((a + 2) <= N && N <= (a + 6*n + 7))
{
printf("%d", n + 2);
break;
}
}
return 0;
}
코드분석
3n(n+1) +2<=N<=3n(n+1) +2 + 6n +5 인 경우
n+2 값을 출력해주면 방의 최소 개수가 도출된다는 논리를 활용하였다.
하지만 if 조건절은 N =1 인 경우가 포함 되지 않으므로 따로
if문을 만들어 주었다.
for 문 범위는 큰 의미 없으니 신경쓰지 않아도 된다.
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 백준 2869번 달팽이는 올라가고 싶다. 풀이 (0) | 2021.09.17 |
---|---|
C언어 백준 1193번 분수찾기 풀이 (1) | 2021.09.17 |
C언어 백준 1712 손익분기점 풀이 (0) | 2021.09.16 |
C언어 백준 1316번 그룹 단어 체커 해설 (0) | 2021.09.16 |
C언어 백준 2941 크로아티아 알파벳 풀이과정 (0) | 2021.09.11 |