[문제 링크]

 

6359번: 만취한 상범

문제 서강대학교 곤자가 기숙사의 지하에는 n개의 방이 일렬로 늘어선 감옥이 있다. 각 방에는 벌점을 많이 받은 학생이 구금되어있다. 그러던 어느 날, 감옥 간수인 상범이는 지루한 나머지 정�

www.acmicpc.net


k번째 방이 열려있거나 닫혀있는 경우는 k의 약수 갯수와 연관이 있다.

k의 약수 갯수가 홀수개라면 문이 열려있고, 짝수개라면 문이 닫혀있다는 것을 알 수 있다.

 

또한 n개의 방이 있을 때 n-1번째까지의 방은 방의 갯수가 늘어났다고하여 값이 변하는 것이 아닌 n-1개의 방이 있을 때 열려있는 문의 갯수와 동일하기 때문에 이를 메모이제이션하면 빠르게 정답을 구할 수 있다.


#include <iostream>
using namespace std;

int memo[101];

int Topdown(int N)
{
	if (N == 1) return 1;

	int& ret = memo[N];
	if (ret != 0) return ret;

	int cnt = 0;
	for (int i = 1; i <= N; i++)
		if (N % i == 0) cnt++;

	return ret = Topdown(N - 1) + (cnt % 2);
}

int Bottomup(int N)
{
	memo[1] = 1;

	for (int i = 2; i <= N; i++)
	{
		int cnt = 0;
		for (int j = 1; j <= i; j++)
			if (i % j == 0) cnt++;

		memo[i] = memo[i - 1] + (cnt % 2);
	}
    
	return memo[N];
}

int main(void)
{
	int tc;
	cin >> tc;

	while (tc--)
	{
		int N;
		cin >> N;

		cout << Topdown(N) << endl;

		cout << Bottomup(N) << endl;
	}

	return 0;
}

알고리즘 200일 프로젝트 - 92 day

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1915번: 가장 큰 정사각형  (0) 2020.07.06
백준 1965번: 상자넣기  (0) 2020.07.06
백준 1937번: 욕심쟁이 판다  (0) 2020.07.06
백준 1309번: 동물원  (0) 2020.07.05
백준 1890번: 점프  (0) 2020.07.03

+ Recent posts