※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 14366번 문제인 Slides! (Large)이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/14366 

 

14366번: Slides! (Large)

For each test case, output one line containing Case #x: y, where x is the test case number (starting from 1) and y is the word POSSIBLE or IMPOSSIBLE, depending on whether the CEO's requirements can be fulfilled or not. If it is possible, output an

www.acmicpc.net

빌딩을 노드, 미끄럼틀을 (방향이 있는) 간선으로 생각해 주어진 상황을 방향그래프로 모델링할 수 있다.

 

위의 모델링에서 만약 "1번 빌딩 -> (사이클) -> B번 빌딩"과 같은 경로가 존재한다면 1번에서 B번 빌딩으로 가는 방법은 무수히 많아지므로 이 그래프는 사이클이 존재하지 않아야한다. 이 경우 1번 빌딩에서 B번 빌딩까지 가는 경로의 개수의 최댓값은 2B2 같다. 이 때의 가능한 모델링 중 하나는 각 i번 빌딩에서 j>i를 만족하는 모든 j번 빌딩으로 미끄럼틀을 놓는 것이다.

 

위의 모델링에서 각 i번 빌딩까지 도달할 수 있는 경로의 수는 각각 2i2(i>1)과 같다는 점을 이용하면, M의 이진수 표기를 이용해 문제를 간단히 해결할 수 있게 된다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;

int ans[50][50];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int T; cin >> T;
	for (int t = 1; t <= T; t++) {
		memset(ans, 0, sizeof(ans));
		int B; ll M; cin >> B >> M;
		for (int i = 0; i < B - 1; i++) {
			for (int j = i + 1; j < B - 1; j++) {
				ans[i][j] = 1;
			}
		}

		ans[0][B - 1] = 1; M--;
		for (int k = 1; k < B - 1; k++) {
			if (M & 1) ans[k][B - 1] = 1;
			M >>= 1;
		}

		cout << "Case #" << t << ": ";
		if (M) cout << "IMPOSSIBLE\n";
		else {
			cout << "POSSIBLE\n";
			for (int i = 0; i < B; i++) {
				for (int j = 0; j < B; j++) {
					cout << ans[i][j];
				}
				cout << '\n';
			}
		}
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 3117 // C++] YouTube  (0) 2023.05.09
[BOJ 14365 // C++] Slides! (Small)  (0) 2023.05.08
[BOJ 5489 // C++] Numbers  (0) 2023.05.07
[BOJ 14367 // C++] Fashion Police (Small)  (0) 2023.05.06
[BOJ 14368 // C++] Fashion Police (Large)  (0) 2023.05.05

+ Recent posts