https://www.acmicpc.net/problem/2292
벌집 그림보고 식겁을 했다. 아침에 양봉 유튜버가 장수말벌 학살하는 영상을 봤던게 생각이나더라..
각설하고, 그림을 보자마자 정신이 아득해졌지만 어떻게든 규칙을 발견하기 위해 애를 썼다.
처음에는 1을 중심으로 직선방향으로 갈때 어떤 규칙이 나타날까 싶어서 머리를 굴려봤지만 규칙도 없거니와 직선방향으로 숫자가 주어지지 않는다면 어떻게 할 방법이 없었기 때문에, 다른 방법을 찾아야 했다.
이게 벌집이 아니라 n단 짜리 케이크라고 생각하는 게 규칙을 찾기가 훨씬 쉬웠다. 중앙에 있는 육각형이 1, 그걸 감싸는 큰 육각형에서 제일 큰 숫자가 7, 그것보다 큰 육각형에서 제일 큰 숫자가 19... 이런식으로 정리해보니 어떤 규칙이 보이기 시작했다.
1...7...19...37...61
수학공부를 열심히 안해서 이게 등차인지 등비수열인지 모르겠고 아무튼 6n씩 증가하는 규칙인 것 같았다.
#include <stdio.h>
int main(void){
int num=0, room=1, i=0, floor=1;
scanf("%d",&num);
while(1){
i++;
room=room+(6*i);
floor++;
if(num==1){
printf("%d",floor-1);
break;
}
else if(room>=num){
printf("%d",floor);
break;
}
}
return 0;
}
room에는 위에서 생각했던 규칙대로 육각형의 갯수를 쌓아갔으며, 입력한 값 num보다 room이 커질 때는 같은 층의 육각형에 있기 때문에 중심 1에서의 직선거리와 층수가 같다는 것을 이용해서 답을 도출했다.
근데 시발 어떤놈은 이렇게 풀었더라
#include <stdio.h>
int main()
{
int k, i, sum = 1;
scanf("%d", &k);
for(i = 1; sum < k; i++)
sum += i * 6;
printf("%d", i);
}
세상은 너무 불공평하다. 왜 이렇게 똑똑한 사람들이랑 멍청한 나를 같은 세상에 살게해서 상대적으로 열등감을 느끼게 만들었을까?
아까 내가 입력한 값 num보다 room이 커질 때 반복문을 벗어나 floor를 출력시키는 아이디어를 이 사람은 굳이 그럴 필요없이 반복문에서 규칙적으로 쌓아가는 room의 갯수가 입력을 받은 값보다 많으면 바로 i값을 빼내는 방법으로 만들었다.
floor를 반복분 내의 i값으로 쓰면서 훨씬 간결한 코드를 만든 것이다. 이렇게 만드니 만약 1을 입력받는다면 sum의 초기값 또한 1이기 때문에 바로 반복문을 빠져나와 i의 초기값 1을 출력하면 된다.
아 이런 사람들에게도 감성이란 게 있을까?