Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 이분 탐색
- 세그먼트 트리
- Knapsack
- 백트래킹
- lis
- 문자열
- 클래스
- 그리디
- 빠른 입출력
- 스택
- 중복 순열
- 크루스칼
- 큐
- 시뮬레이션
- 비트마스크
- 우선순위 큐
- 분할 정복
- 재귀
- 조합
- 링크드리스트
- SSAFY
- MST
- 완전 탐색
- BeautifulSoup
- 피보나치 수
- DP
- 메모리풀
- BFS
- 순열
- dfs
Archives
- Today
- Total
작심 24/7
[백준] 1339번 단어 수학 본문
1339번: 단어 수학
첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대
www.acmicpc.net
수학적으로 풀어도 되지만
백트래킹으로 풀어보았다.
계산에 사용되는 M개의 알파벳을 모아놓고
9부터 M개의 숫자를 순열로 대입하였다.
ex) ADC -> 3개의 숫자 9, 8, 7을 순열로 배치시키면
알파벳 ADC는
987, 978, 897, 879, 798, 789
이렇게 숫자가 대입될 수 있다.
map을 이용해서 각 알파벳에 숫자를 대입해주고
배치가 완료되면 단어의 합을 계산해주고 최댓값을 갱신한다.
이때 stoi를 이용하여 계산을 했었는데 시간 초과 나서
그냥 int형으로 계산해주니 통과되었다.
string형 계산이 시간 많이 걸리긴 하나보다.
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
int N, Max;
string alphabet, word[11], num;
map <char, int> m;
bool chk[10] = { false };
void Permutation(int cnt) {
if (cnt == alphabet.size()) {
int res = 0;
for (int i = 0; i < N; i++) {
int tmp = 0;
for (int j = 0; j < word[i].size(); j++) tmp = tmp*10 + m[word[i][j]];
res += tmp;
}
Max = max(Max, res);
return;
}
for (int i = 9; i >= 10 - (int)alphabet.size(); i--) {
if (chk[i]) continue;
chk[i] = true, m[alphabet[cnt]] = i;
Permutation(cnt + 1);
chk[i] = false;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> word[i];
for (int j = 0; j < word[i].size(); j++) {
if (!m[word[i][j]]) {
m[word[i][j]] = -1, alphabet += word[i][j];
}
}
}
Permutation(0);
cout << Max;
return 0;
}
'백준' 카테고리의 다른 글
[백준] 11062번 카드 게임 (0) | 2020.09.04 |
---|---|
[백준] 16890번 창업 (0) | 2020.09.01 |
[백준] 16500번 문자열 판별 (0) | 2020.08.27 |
[백준] 11652번 카드 (0) | 2020.08.27 |
[백준] 9252번 LCS 2 (0) | 2020.08.27 |
Comments