๐Ÿ•๏ธ ICPC Sinchon/Backtracking

[BOJ][C++] ๋ฐฑ์ค€ 15811๋ฒˆ: ๋ณต๋ฉด์‚ฐ?!

์„ ๋‹ฌ 2023. 1. 22. 05:39
๋ฐ˜์‘ํ˜•

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

 

15811๋ฒˆ: ๋ณต๋ฉด์‚ฐ?!

๋ณต๋ฉด์‚ฐ์ด๋ž€ ์ˆ˜ํ•™ ํผ์ฆ์˜ ์ผ์ข…์œผ๋กœ, ์–ด๋–ค ๊ณ„์‚ฐ์‹์˜ ๊ฐ ์ˆซ์ž๋“ค์„ ํŠน์ • ๋ฌธ์ž๋กœ ๋ฐ”๊พธ๋ฉด ๊ฐ ๋ฌธ์ž๊ฐ€ ์–ด๋–ค ์ˆซ์ž์ธ์ง€ ๋งž์ถ”๋Š” ํผ์ฆ์ด๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ SEND+MORE=MONEY๊ฐ€ ์žˆ๋‹ค. SEND + MORE ------ MONEY S=9, E=5, N=6, D=7,

www.acmicpc.net

 

๋ฌธ์ œ

๋ณต๋ฉด์‚ฐ์ด๋ž€ ์ˆ˜ํ•™ ํผ์ฆ์˜ ์ผ์ข…์œผ๋กœ, ์–ด๋–ค ๊ณ„์‚ฐ์‹์˜ ๊ฐ ์ˆซ์ž๋“ค์„ ํŠน์ • ๋ฌธ์ž๋กœ ๋ฐ”๊พธ๋ฉด ๊ฐ ๋ฌธ์ž๊ฐ€ ์–ด๋–ค ์ˆซ์ž์ธ์ง€ ๋งž์ถ”๋Š” ํผ์ฆ์ด๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ 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;
}

/*
 */
๋ฐ˜์‘ํ˜•