https://www.acmicpc.net/problem/15811
๋ฌธ์
๋ณต๋ฉด์ฐ์ด๋ ์ํ ํผ์ฆ์ ์ผ์ข ์ผ๋ก, ์ด๋ค ๊ณ์ฐ์์ ๊ฐ ์ซ์๋ค์ ํน์ ๋ฌธ์๋ก ๋ฐ๊พธ๋ฉด ๊ฐ ๋ฌธ์๊ฐ ์ด๋ค ์ซ์์ธ์ง ๋ง์ถ๋ ํผ์ฆ์ด๋ค.
๋ํ์ ์ผ๋ก SEND+MORE=MONEY๊ฐ ์๋ค.
SEND
+ MORE
------
MONEY
S=9, E=5, N=6, D=7, M=1, O=0, R=8, Y=2๋ก ๋ฐ๊พธ๋ฉด ์์ด ์ฑ๋ฆฝํ๋ค.
9567
+ 1085
------
10652
๋ณต๋ฉด์ฐ ๋ฌธ์ ๊ฐ ์ฃผ์ด์ง ๋, ๋ต์ด ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ์ถ๋ ฅํ์์ค.
๋จ, ๊ฐ์ ๋ฌธ์๋ ๊ฐ์ ์ซ์์ ๋์๋์ด์ผ ํ๋ฉฐ, ์๋ก ๋ค๋ฅธ ๋ฌธ์๋ ์๋ก ๋ค๋ฅธ ์ซ์๋ฅผ ๋ํ๋ธ๋ค. ๋ํ, ์๋ 0์ผ๋ก ์์ํ ์ ์๋ค.
์ ๋ ฅ
์ธ ๋จ์ด๊ฐ ๊ณต๋ฐฑ์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ฒซ ๋ฒ์งธ ๋จ์ด์ ๋ ๋ฒ์งธ ๋จ์ด๋ฅผ ๋ํ ๊ฒฐ๊ณผ๊ฐ ์ธ ๋ฒ์งธ ๋จ์ด์์ ์๋ฏธํ๋ค.
๋จ์ด๋ ๊ณต๋ฐฑ ์์ด ์ํ๋ฒณ ๋๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ ๊ฐ ๋จ์ด์ ๊ธธ์ด๋ 18์๋ฆฌ๋ฅผ ๋์ง ์๋๋ค.
์ถ๋ ฅ
๊ณ์ฐ์์ ํด๋ต์ด ์กด์ฌํ๋ค๋ฉด YES๋ฅผ, ๊ทธ๋ ์ง ์๋ค๋ฉด NO๋ฅผ ํ ์ค์ ์ถ๋ ฅํ๋ค.
ํ์ด
์๊ฐ 18์๋ฆฌ๊น์ง ๋ ์ ์๋ค -> int๊ฐ ์๋ long long์ผ๋ก ํด์ผํ๋ค๋ ์ฌ์ค์ ์ฃผ์ํ์
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
using namespace std;
string input[3];
vector<char> usedAlpha;
int alphabet[26];
bool numUsed[11], ans=false;
void recur(int cnt) {
if(ans) // ์ด๋ฏธ ๊ตฌํด์ก๋ค๋ฉด ํจ์ค
return;
if(cnt == usedAlpha.size()) { // ํ ๋น ๋ค ํ๋?
// wordNum[x] = x๋ฒ์งธ ์
๋ ฅ๊ฐ(๋ฌธ์์ด)์ ์๋ก ๋ณํํ๊ฑฐ
long long wordNum[3];
wordNum[0] = wordNum[1] = wordNum[2] = 0;
for(int i=0; i<3; i++) {
for(int j=0; j<input[i].size(); j++) {
wordNum[i] *= 10;
wordNum[i] += alphabet[input[i][j]-'A'];
}
}
// ๋ณํํ๊ฑฐ ๊ณ์ฐ ๋ง๋?
if(wordNum[0] + wordNum[1] == wordNum[2])
ans = true;
return;
}
int cur = usedAlpha[cnt]-'A'; // ํ์ฌ ๋์์์ผ๋ณผ ์ํ๋ฒณ
for(int i=0; i<=9; i++) {
if(numUsed[i]) // ์ด๋ฏธ ์ฌ์ฉํ ์ซ์๋ผ๋ฉด ํจ์ค
continue;
// ์ซ์ ์ฌ์ฉ, ์ํ๋ฒณ์ ์ซ์ ํ ๋น, ์ฌ๊ท(๋ฐฑํธ๋ํน)
numUsed[i] = true;
alphabet[cur] = i;
recur(cnt+1);
alphabet[cur] = i-1;
numUsed[i] = false;
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
cin >> input[0] >> input[1] >> input[2];
for(int i=0; i<3; i++)
for(int j=0; j<input[i].size(); j++)
alphabet[input[i][j] - 'A'] = 1;
for(int i=0; i<26; i++)
if(alphabet[i]) // ์ฌ์ฉ๋ ์ํ๋ฒณ์ด๋ผ๋ฉด
usedAlpha.push_back(i+'A');
// ์ฌ์ฉ๋ ๊ธ์๊ฐ 10๊ฐ๋ฅผ ๋์ด๋ฒ๋ฆฐ๋ค๋ฉด
if(usedAlpha.size() > 10) {
cout << "NO";
return 0;
}
recur(0);
if(ans)
cout << "YES";
else
cout << "NO";
return 0;
}
/*
*/
'๐๏ธ ICPC Sinchon > Backtracking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 1759๋ฒ: ์ํธ ๋ง๋ค๊ธฐ (0) | 2023.11.22 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 14888๋ฒ: ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ (0) | 2023.07.06 |
[BOJ][C++] ๋ฐฑ์ค 2661๋ฒ: ์ข์์์ด (0) | 2023.01.22 |
[BOJ][C++] ๋ฐฑ์ค 2580๋ฒ: ์ค๋์ฟ (0) | 2023.01.22 |
[BOJ][C++] ๋ฐฑ์ค 23304๋ฒ: ์์นด๋ผ์นด (0) | 2023.01.21 |