반응형

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

 

1132번: 합

N개의 수가 주어진다. 이 숫자는 모두 자연수이고, 알파벳 A부터 J가 자리수를 대신해서 쓰여 있다. 이 알파벳은 모두 한 자리를 의미한다. 그리고, 각 자리수는 정확하게 알파벳 하나이다. 0으로

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. 각 문자열을 입력받고, 각 알파벳에 따라 자릿수를 arr 배열에 저장하고, 첫 자리에 오는지 오지 않는지 isFirst 배열에 저장합니다.

 

2. arr 배열을 내림차순으로 정렬하고, 만약 가장 작은 자릿수의 숫자가 첫번째 수라면 0이 오면 안 되기 때문에 첫 자리에 오는 수가 없는 알파벳과 교환합니다.

 

3. arr 배열을 내림차순으로 0부터 8번 인덱스까지만 정렬합니다.

 

4. arr 배열을 0부터 9까지 for문을 이용하여 돌면서 0번 인덱스일 경우 9를 곱해주고, 1번 인덱스일 경우 8을 곱해주면서 9번 인덱스까지 ans에 더해줍니다.

 

5. ans를 출력합니다.

 

[ 소스코드 ]

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<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#define ll long long
 
using namespace std;
 
int N;
pair<ll,int> arr[26];
bool isFirst[26];
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> N;
 
    for (int i = 0; i < 26; i++) {
        arr[i].second = i;
    }
 
    for (int i = 0; i < N; i++) {
        string str;
        cin >> str;
        isFirst[str[0- 'A'= true;
 
        for (int j = 0; j < str.size(); j++) {
            arr[str[j] - 'A'].first += pow(10, str.size() - j - 1);
        }
    }
 
    sort(arr, arr + 26, greater<>());
 
    if (isFirst[arr[9].second]) {
        for (int i = 8; i >= 0; i--) {
            if (isFirst[arr[i].second] == false) {
                swap(arr[9], arr[i]);
                break;
            }
        }
    }
 
    sort(arr, arr + 9, greater<>());
 
    ll ans = 0;
    int cnt = 9;
 
    for (int i = 0; i < 10; i++) {
        ans += arr[i].first * cnt--;
    }
 
    cout << ans;
}
cs
반응형

+ Recent posts