N개의 팻말의 양면에 단어가 하나씩 적혀있다.


이 팻말은 앞면, 혹은 뒷면만 사용할 수 있는데 각 단어를 표시하기 위해서는 단어를 구성하는 알파벳 블록이 필요하다.


예를들어 "cat"를 표시하려면 c = a = t = 1개씩 필요하다.


이때 가능한 모든 경우를 표시하기 위해서 필요한 알파벳 블록 최소값을 구해야 한다.



해법


모든 경우를 따지자면 2^N인데 N이 최대 100이라 이건 안된다. 다른 방법을 생각해보면


i번째 팻말을 표시할 때 필요한 블록의 개수가


i번째 팻말의 앞 : cnt[0]['a'] cnt[0]['b'] .... cnt[0]['z']

i번째 팻말의 뒤 : cnt[1]['a'] cnt[1]['b'] .... cnt[1]['z']


이라고 할 때 어떤 경우에도 i번째 팻말을 표시할 수 있으려면 필요한 알파벳 블록의 갯수는


cnt[alphabet] = max(cnt[0][alphabet], cnt[1][alphabet])


이다. 따라서 팻말별로 앞뒤로 필요한 알파벳 블록을 구해놓고 둘중 더 큰값을 최종 결과에 더해나가면 최악의 경우에도 모두 표시 할 수 있다.


#include <stdio.h>
#include <algorithm>
using namespace std;
 
int n, ans[26];
 
int main() {
    scanf("%d"&n);
    while (n--) {
        char s[2][11];
        int cnt[2][26= { 0, };
        for (int i = 0; i < 2++i) {
            scanf(" %s", s[i]);
            for (int j = 0; s[i][j]; ++j) cnt[i][s[i][j] - 'a']++;
        }
        for (int i = 0; i < 26++i) ans[i] += max(cnt[0][i], cnt[1][i]);
    }
    for (int i = 0; i < 26++i) printf("%d\n", ans[i]);
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

14467 소가 길을 건너간 이유 1  (0) 2018.11.10
14175 The Cow-Signal  (0) 2018.11.10
14173 Square Pasture  (0) 2018.11.10
11978 Mowing the Field (Bronze)  (0) 2018.11.10
11977 Angry Cows (Bronze)  (0) 2018.11.10

+ Recent posts