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

 

이번에 볼 문제는 백준 15811번 문제인 복면산?!이다.
문제는 아래 링크를 확인하자.

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

 

15811번: 복면산?!

복면산이란 수학 퍼즐의 일종으로, 어떤 계산식의 각 숫자들을 특정 문자로 바꾸면 각 문자가 어떤 숫자인지 맞추는 퍼즐이다. 대표적으로 SEND+MORE=MONEY가 있다. SEND + MORE ------ MONEY S=9, E=5, N=6, D=7,

www.acmicpc.net

주어지는 각 문자를 미지수 하나로 대응하고 수식으로 바꾸면, 각 미지수에 서로 다른 한자리 정수를 집어넣어 보는 완전탐색을 통해 문제를 해결할 수 있다.

 

등장하는 문자의 가짓수는 10개를 넘을 수 있음에 유의하여 구현하자.

 

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

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

int idx = 1;
int chartoidx[128];
ll cnt[27];
ll val = 0;
bool ans = 0;
bool visited[10];

void func(int cur) {
	if (cur == idx) {
		if (val == 0) ans = 1;
		return;
	}
	for (int i = 0; i < 10; i++) {
		if (visited[i]) continue;
		visited[i] = 1;
		val += cnt[cur] * i;
		func(cur + 1);
		val -= cnt[cur] * i;
		visited[i] = 0;
	}
}

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

	string s1, s2, s3; cin >> s1 >> s2 >> s3;
	int s1len = s1.length(), s2len = s2.length(), s3len = s3.length();
	ll digit = 1;
	for (int i = s1len - 1; i > -1; i--) {
		if (chartoidx[s1[i]] == 0) chartoidx[s1[i]] = idx++;
		cnt[chartoidx[s1[i]]] += digit;
		digit *= 10;
	}
	digit = 1;
	for (int i = s2len - 1; i > -1; i--) {
		if (chartoidx[s2[i]] == 0) chartoidx[s2[i]] = idx++;
		cnt[chartoidx[s2[i]]] += digit;
		digit *= 10;
	}
	digit = 1;
	for (int i = s3len - 1; i > -1; i--) {
		if (chartoidx[s3[i]] == 0) chartoidx[s3[i]] = idx++;
		cnt[chartoidx[s3[i]]] -= digit;
		digit *= 10;
	}

	if (idx > 11) {
		cout << "NO";
		return 0;
	}

	func(1);

	if (ans) cout << "YES";
	else cout << "NO";
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 15957 // C++] 음악 추천  (0) 2022.07.26
[BOJ 8217 // C++] 유성  (0) 2022.07.25
[BOJ 12355 // C++] Ocean View (Large)  (0) 2022.07.24
[BOJ 15564 // C++] Äventyr 2  (0) 2022.07.24
[BOJ 23080 // C++] 스키테일 암호  (0) 2022.07.24

+ Recent posts