728x90
 

2292번: 벌집

위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.

www.acmicpc.net

동적계획법으로 풀었다.

2-tuple인 pair를 만들어서 첫 번째 원소에는 1로부터 i만큼 떨어져있는 벌집들 중 가장 작은 번호를 가진 벌집의 번호를, 두 번째 원소에는 1로부터 i만큼 떨어져 있는 벌집들 중 가장 큰 번호를 가진 벌집의 번호를 저장해서 벡터에 저장했다.

#include <iostream>
#include <tuple>
#include <vector>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<pair<int, int>> room;
	room.push_back(make_pair(1, 1));
	room.push_back(make_pair(2, 7));
	int i = 2;
	while (room[i - 1].second < n) {
		room.push_back(make_pair(room[i - 1].second + 1, room[i - 1].second + 6 * i));
		i++;
	}
	if (n == 1) cout << 1;
	else cout << i;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 11726번 2×n 타일링  (0) 2020.02.01
[백준] 10844번 쉬운 계단 수  (0) 2020.01.31
[백준] 2193번 이친수  (0) 2020.01.31
[백준] 1193번 분수찾기  (0) 2020.01.31
[백준] 2751번 수 정렬하기 2  (0) 2020.01.31

+ Recent posts