개발 지식/알고리즘
백준 2292 벌집 C++
Prcnsi
2022. 7. 26. 22:24
728x90
블하~ 안녕하세요. 오랜만에 글을 쓰는데 요즘 업로드가 뜸했던 것 같습니다.
지난 1학기 동안 생각지 못한 많은 걸 연구실에서 배운 것 같아 감사하게 생각하고 있습니다.
그래서 제가 블로그에 공유할거리들이 쌓여 있는데 제가 게을러서 요즘 잘 안 올렸네요.
앞으로는 더 꾸준하게 올려야겠습니다.
서론이 길었는데 오늘 제가 푼 문제는 백준 2292 벌집 문제입니다.
https://www.acmicpc.net/problem/2292
우선 이 문제는 아래 벌집의 1이 적혀 있는 칸에서 시작해서 임의의 값이 들어왔을 때 그 값까지 몇 칸을 지나야 하는지 구하는 문제입니다.
풀이
이 문제는 벌집의 숫자가 주어졌을 때 그 숫자까지 가는데 몇 개의 방을 지나는지 구하는 문제입니다.
이 문제의 패턴은 아래와 같이 정리할 수 있습니다.
라인의 수 | 값 | 개수 | 이전 끝자리와 차이 |
1 | 1 | 1 | x |
2 | 2~7 | 6 | +6 |
3 | 8~19 | 12 | +12 |
4 | 20-37 | 18 | +18 |
5 | 38~61 | 24 | +24 |
6 | 62-91 | 30 | +30 |
그럼 이제 위 패턴에서 마지막자리를 기준으로 입력받은 수가 마지막 자리보다 작으면 그 줄에 속하므로 그 줄을 출력하고 그 줄보다 크면 다음 줄로 끝자리 변수를 (라인의 개수)*6으로 더해주면서 무한루프를 돌리면 벌꿀집이 해당하는 곳에서 멈춰서 출력하게 됩니다.
그래서 코드는 아래와 같이 됩니다!
#include <iostream>
using namespace std;
int main() {
int endValue = 1; // 벌꿀집 라인별 마지막 수를 기록할 변수
int inputValue=0; // 입력 받은 값
int line = 1; // 몇 번째 줄인지 기록할 변수;
cin >> inputValue;
while (1) {
// 입력 받은 수가 줄의 마지막 수보다 작거나 같으면
if (endValue >= inputValue) {
// 그 라인에 있는 것으로 해석해
cout << line << '\n';
break;
}
// 입력 받은 수가 줄의 마지막 수보다 크다면 해당 라인보다 큰 줄에 있는걸로 해석해서
else {
endValue += line*6; // 줄의 마지막 수에 증가량을 더해 다음줄의 마지막 수 표현
line += 1; // 그리고 다음 줄로 넘어감
}
}
return 0;
}
728x90