728x90
https://www.acmicpc.net/problem/1132
1132번: 합
N개의 수가 주어진다. 이 숫자는 모두 자연수이고, 알파벳 A부터 J가 자리수를 대신해서 쓰여 있다. 이 알파벳은 모두 한 자리를 의미한다. 그리고, 각 자리수는 정확하게 알파벳 하나이다. 0으로
www.acmicpc.net
예제 1번을 예로 들어
ABC
BCA
를 더하면
(A+B) + (B+C) + (C+A)
100 10 1
각 자리수를 나타나게 된다
ABC를 변수 취급하고
저 자리수들의 합을 계수 취급했다.
그래서
A : 101
B : 110
C : 11
(이하 cost 라 칭하겠습니다)
그래서 저 수를 내림차순으로 정렬해
B : 110 * 9
A : 101 * 8
C : 11 * 7
더하면 1875 가 나온다.
이러한 방법을 진행했는데
예제 3 번의 경우
ABCDEFGHIJ
J
여기서 모든 숫자는 0으로 시작하지 않기 때문에 J는 0이 되면 안된다.
0이 되는 경우는 987...210 총 10자리수 이상일 때만
0이 나올 수 있다.
그래서 0 이 되면 안되는 알파벳을 미치 체크해두고
숫자 자리수 크기가 10이상이고,
예제 1번처럼 내림차순 정렬했을 때
맨 마지막에 위치하는 알파벳이 0이 되면 안될 때
현재 알파벳 중 맨 마지막 알파벳 제외 가장 작은 수( cost가 가장 작은 수)와 교체하였습니다.
처음에 왜 자꾸 안되지했는데
A~J 길래 최대 길이가 10일 줄 알았다.
문제를 잘 읽자
this is maximum 12자리 baby
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main(void) {
int n;
cin >> n;
vector<string> str(n);
vector<bool> not_zero(10, false);
int size = 0;
for (int i = 0; i < n; i++) {
cin >> str[i];
if (size < str[i].size())
size = str[i].size();
not_zero[str[i][0] - 65] = true;
}
vector<string> ch(size, "");
vector<pair<long long, char>> alpha(10);
char c = 'A';
for (int i = 0; i < 10; i++) {
alpha[i] = { 0,c };
c++;
}
for (int i = 0; i < n; i++) {
string temp = str[i];
for (int j = size - 1; j >= 0; j--) {
ch[j] += temp.back();
temp.pop_back();
if (temp.size() == 0)
break;
}
}
long long p = 1;
for (int i = size - 1; i >= 0; i--) {
string temp = ch[i];
for (int j = 0; j < temp.size(); j++) {
alpha[temp[j] - 65].first += p;
}
p *= 10;
}
sort(alpha.begin(), alpha.end(), greater<>());
if (not_zero[alpha[9].second - 65] && size >= 10) {
int index = -1;
long long value = alpha[0].first; // 임의의 큰 수
for (int i = 0; i < 10; i++) {
if (!not_zero[alpha[i].second - 65] && value >= alpha[i].first) {
value = alpha[i].first;
index = i;
}
}
swap(alpha[index], alpha[9]);
sort(alpha.begin(), alpha.end()-1, greater<>());
}
int i = 0;
p = 9;
long long sum = 0;
while (i < 10) {
if (alpha[i].first == 0)
break;
sum += (alpha[i].first * p);
p--;
i++;
}
cout << sum;
}

728x90
'문제 > 백준' 카테고리의 다른 글
| c++ 백준_1167_"트리의 지름" (2) | 2023.06.13 |
|---|---|
| c++ 백준_1918_"후위 표기식" (2) | 2023.06.13 |
| c++ 백준_15686_"치킨 배달" (2) | 2023.06.13 |
| c++ 백준_1254_"팰린드롬 만들기" (0) | 2023.06.13 |
| c++, python 백준_1915_"가장 큰 정사각형" (0) | 2023.06.13 |