Young

BOJ - 복면산?! (15811) 본문

코딩 테스트 대비 추천 문제

BOJ - 복면산?! (15811)

yyjjang9 2019. 12. 11. 01:09
728x90
반응형

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

 

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 복면산 문제가 주어질 때, 답이 존재하는지 여부를 출력하시오. 단, 같은 문자는 같은 숫자에 대응되어야

www.acmicpc.net

 

오늘도 완전탐색입니다.

세 개의 문자열이 주어지면, 존재하는 각 알파벳에 

0부터 9까지의 숫자를 분배해주고, 덧셈을 만족하는지 보면 됩니다.

 

여기서 요점은 바로 0부터 9까지 숫자를 분배해주는 것을 구현하는 것입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <bits/stdc++.h>
 
using  namespace std;
 
bool chk[11];    // 0~9까지의 숫자를 분배했는지 여부를 체크하기 위한 배열
vector<int> v;    // 등장하는 중복 제거한 알파벳 값을 가지고 있는 배열
int asg[33];    // 각 알파벳에 0~9 사이의 어떤 값을 할당했는지 저장하고 있는 배열
string s[3];    // input으로 들어오는 값을 저장하는 문자열
 
void sol(int cur){            
    if(cur == v.size()){        // 등장하는 모든 알파벳에 값을 할당했으면 맞게 할당했는지 확인해본다.
        ll b[3= {};            // 각 값을 숫자로 변환하여 저장하기 위한 변수
        for(int i = 0; i < 3; i++){            // 알파벳 숫자를 진짜 숫자로 변환하는 과정
            for(int j = 0; j < s[i].size(); j++){
                b[i] *= 10;
                b[i] += asg[s[i][j] - 'A'];
            }
        }
 
        if(b[0+ b[1== b[2]) {    // 맞는지 확인
            cout << "YES";
            exit(0);
        }
        return;
    }
 
    int idx = v[cur];                // 알파벳 
 
    for(int i = 0; i <= 9; i++){    // 0~9 숫자 할당을 시도해본다
        if(chk[i]) continue;        // 이미 할당했다면, 무시하고 다른 숫자를 할당해본다
        asg[idx] = i;                // 숫자를 할당한다
        chk[i] = true;                // 숫자가 할당됐음을 기록한다.
        sol(cur + 1);                // 다음 알파벳에 할당을 시도한다
        chk[i] = false;                // 숫자 할당을 취소한다
        asg[idx] = -1;
    }
}
 
int main(){
    bool chk[30= {};
    for(int i = 0; i < 3; i++){
        cin >> s[i];
        for(int j = 0; j < s[i].size(); j++)
            chk[s[i][j] - 'A'= true;
    }
 
    for(char a = 'a'; a <= 'z'; a++){
        if(chk[a - 'a']) v.push_back(a - 'a');
    }
 
    if(v.size() <= 10) {    // 10개 이하 알파벳이 등장할 때만 숫자 할당을 시도한다
        sol(0);
    }
    
    cout << "NO";
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
728x90
반응형