벌집 문제로 이전에 했던 투포인트보다 논리적으론 조금 어려운 문제이다.
(나는 투포인트 문제가 더 쉬웠다)
설명
문제는 비교적 직관적으로 이해하기 쉬운 편이다.
위와 같이 벌집이 있을때, 벌집을 자세히 관찰 해 보면 특정 숫자 구간마다 경로가 증가하는것을 확인할 수 있다.
위 선을 기준으로 벌집의 경로가 하나씩 증가한다.
7 의 경우엔 = 1,7 → 2
8 의 경우엔 = 1,2,8 or 1,7,8 → 3
육각형 내의 경로점을 그려보면,
같은 육각형 내의 선분이 지나가는 모든 구간은
같은 경로점을 지니는것을 확인할 수 있다.
57 = 1,6,17,34,37 → 5
58 = 1,6,17,35,58 → 5
이것을 파악하면, 7, 19, 37, 61 구간에서 input 값이 +1 되면 육각형 기준이 바뀌는 것을 확인할 수 있다.
그런데 7, 19, 37, 61 는 규칙이 있다.
1 → 7 = +6
7 → 19 = +12
19 → 37 = +18
37 → 61 = +24
즉 증가되는 값이 6의 배수인 것이다.
이 규칙까지 파악했다면 이 문제는 다 푼것과 같다.
코드
#include <iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
unsigned int input;
unsigned int point = 1;
unsigned int temp = 6;
unsigned int result = 1;
cin >> input;
while (true)
{
if (point >= input)
{
break;
}
point += temp;
temp += 6;
++result;
}
cout << result;
}
별로 설명할것도 없다.
input = 입력값
point = 위 이미지에서 언급했던 '경계값' 에 해당하는지
즉 7, 19, 37, 61 보다 큰지 확인한다.
만약 크다면 point 값에 temp 를 더한다.
여기서 temp 값은 6의 배수로 구성되어 있다.
벌집 한번을 돌때마다 6, 12, 18, 24, 30 ... 을 더해줘야 하므로
그렇다면 포인트는 위 선분상에 있는 벌집과 같은 수를 가지게 된다.
7, 19, 37, 61, 91, 127, 169, 217...
만약 이 기준보다 크다면 result 를 하나 늘리고,
이 기준보다 작다면 과정을 멈추고 result 를 출력한다.
끝.
'Algorithm > BACKJOON' 카테고리의 다른 글
[C++] 백준 2166번 문제 해설 (0) | 2022.06.29 |
---|---|
[C++] 백준 1305 번 문제 해설 (0) | 2022.06.03 |
[C++] 백준 19942 번 문제 풀이 (0) | 2021.08.08 |
[C++] 백준 1009 번 문제 해설 (0) | 2021.07.18 |
[C++] 백준 3273 문제 해설 (0) | 2021.06.26 |