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

 

이번에 볼 문제는 백준 2784번 문제인 가로 세로 퍼즐이다.
문제는 아래 링크를 확인하자.

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

 

2784번: 가로 세로 퍼즐

6개 단어를 3*3 가로 세로 퍼즐에 놓을 수 없다면 0을 출력한다. 그렇지 않다면, 3개 줄에 퍼즐을 출력한다. 만약 가능한 답이 여러개라면 사전순으로 앞서는 것을 출력한다. 사전순으로 비교를 할

www.acmicpc.net

주어진 6개 단어를 모두 사용하여 가로 세로 퍼즐을 올바르게 채울 수 있는지 여부를 판단하는 문제이다.

 

글쓴이는 주어진 단어들의 각각의 순열에 대하여 첫 세 단어를 가로로 나열한 퍼즐과 나중 세 단어를 세로로 나열한 퍼즐을 만들어 둘이 같은 경우 중 사전순으로 가장 빠른 답안을 출력해 문제를 해결하였다.

 

모든 순열에 접근하는 것은 next_permutation을 이용해 간단하게 해낼 수 있다.

 

c++의 문자열은 사전순 비교 연산 '<'가 정의되어 있으므로 사전순 비교 또한 간단하게 구현할 수 있다.

 

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

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int pmt[6] = { 0,1,2,3,4,5 };
string s[6];
char bd1[3][3], bd2[3][3];

string ans = "zzzzzzzzzzzz";

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

	for (int i = 0; i < 6; i++) cin >> s[i];

	while (1) {
		for (int r = 0; r < 3; r++) {
			for (int c = 0; c < 3; c++) bd1[r][c] = s[pmt[r]][c];
		}

		for (int c = 0; c < 3; c++) {
			for (int r = 0; r < 3; r++) bd2[r][c] = s[pmt[c + 3]][r];
		}

		bool sgn = 1;
		for (int r = 0; r < 3; r++) {
			for (int c = 0; c < 3; c++) {
				if (bd1[r][c] != bd2[r][c]) sgn = 0;
			}
		}

		if (sgn) ans = min(ans, s[pmt[0]] + s[pmt[1]] + s[pmt[2]]);

		if (!next_permutation(pmt, pmt + 6)) break;
	}

	if (ans.length() > 9) cout << 0;
	else cout << ans.substr(0, 3) << '\n' << ans.substr(3, 3) << '\n' << ans.substr(6, 3);
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 11123 // C++] 양 한마리... 양 두마리...  (1) 2024.01.29
[BOJ 2790 // C++] F7  (0) 2024.01.28
[BOJ 2980 // C++] 도로와 신호등  (1) 2024.01.26
[BOJ 4657 // C++] Image Perimeters  (0) 2024.01.25
[BOJ 8219 // C++] Coprime Numbers  (0) 2024.01.24

+ Recent posts