백준 1339 단어 수학
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 1339 단어 수학

by KyeongMin 2019. 7. 23.
728x90
반응형

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

 

1339번: 단어 수학

첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대 10개이고, 수의 최대 길이는 8이다. 서로 다른 문자는 서로 다른 숫자를 나타낸다.

www.acmicpc.net

알파벳에 1부터 10까지 숫자를 부여해서 주어진 식의 합이 최대가 되는 것을 출력하는 것으로 

어떻게 보든 모든것을 완전 탐색을 해봐야 아는 문제입니다.

A 에도 1 부터 10까지

B 에도 C에도 Z까지 각 1부터 10까지 부여해야 하므로 가장 간단한 완전 탐색 방법 중 하나인 재귀를 이용한 백트래킹을

사용하면 됩니다.

 

기본 모든 순열을 찾아서 각 알파벳에 주어진 숫자를 정수로 바꾸어 나온 결과에 최댓값만 뽑아내면 됨으로 

설명은 여기까지 맞추고 소스를 보고 이해하시기 바랍니다.

처음에 실수했던 것은 모든 예제가 잘 나왔었는데 우연히 예제가 맞았던 것 같고

사용된 알파벳을 체크하는 Alpha 배열은 제대로 했는데

그 Alpha에 저장된 사용된 알파벳의 순서를 넣어놓은 구조체 배열에 조금 오류가 생겨 좀 난감했던 문제였습니다.

 

 

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char input[11][11];
int N;
int Alpha[26];
bool cmp(int a, int b)
{
    return a > b;
}
typedef struct Data {
    int num;
}D;
D Alpha1[26];
int idx = 0;
int ten[11= { 1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,1000000000 };
void init() {
    scanf("%d"&N);
    for (int i = 0; i < N; i++) {
        scanf("%s", input[i]);
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < strlen(input[i]); j++)
            Alpha[input[i][j] - 'A'= 1;
    }
    for (int i = 0; i < 26; i++) {
        if (Alpha[i] == 1) {
            Alpha1[i].num = idx++;
        }
    }
    //sort(Alpha, Alpha + 24,cmp);
}
int num[26];
int chk[26];
long long int Max = -987654321;
void dfs(int id) {
 
    if (id == idx) {
        long long int ret = 0;
 
        for (int i = 0; i < N; i++) {
            int len = strlen(input[i]);
        int ten1 = len - 1;
        
            for (int j = 0; j < len; j++)
            {
 
                ret += num[Alpha1[input[i][j] - 'A'].num] * ten[ten1--];
            }
        }
        if (Max < ret) Max = ret;
        return;
    }
    else {
        for (int i = 9; i >= 9 - idx + 1; i--) {
            if (num[id] == -1 && chk[i] == 0) {
                chk[i] = 1;
                num[id] = i;
                dfs(id + 1);
                num[id] = -1;
                chk[i] = 0;
            }
        }
    }
}
int main(void) {
 
    init();
    for (int i = 0; i < 26; i++) {
        num[i] = -1;
    }
    dfs(0);
    printf("%lld", Max);
    return 0;
}
 
 

주어진 각각의 숫자를 하나의 정수로 만드는 방식은 여러 가지지만 저는 배열에 10의 배수를 넣고 인덱스로

가져다 쓰는 방식을 사용했습니다.

오늘은 여기까지이고 질문이나 이상한 점 있으시면 태클 부탁드립니다.

728x90
반응형

'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글

백준 11723 집합  (0) 2019.07.24
백준 6603 로또  (0) 2019.07.24
백준 1248 맞춰봐  (0) 2019.07.23
백준 10819 차이를 최대로  (0) 2019.07.23
백준 10973 이전 순열  (0) 2019.07.23

댓글