Baekjoon

Baekjoon 1062번 가르침

ppwag 2020. 10. 7. 23:41

문제

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

걸린 시간

01 : 24 : 47 실패

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

int n, k;
int learn = 0, ans = 0;
string w;
vector<int> word;

void solve(int cnt, int idx, int cur){
    // 기저 사례
    if(cnt == 0){
        int read = 0;
        for(int i = 0; i < n; i++)
            if(word[i] == (word[i]&cur))
                read++;
        ans = max(ans, read);
        return;
    }
    // 재귀 호출
    for(int i = idx+1; i < 26; i++)
        if(!((1<<i)&cur))
            solve(cnt-1, i, cur|(1<<i));
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> k;
    word.resize(n, 0);
    for(int i = 0; i < n; i++){
        cin >> w;
        w.erase(0, 4);
        w.erase(w.size()-4, w.size());
        for(int j = 0; j < w.size(); j++)
            word[i] |= (1<<((int)w[j]-0x61));
    }
    learn |= (1<<(int)'a'-0x61);
    learn |= (1<<(int)'n'-0x61);
    learn |= (1<<(int)'t'-0x61);
    learn |= (1<<(int)'i'-0x61);
    learn |= (1<<(int)'c'-0x61);
    if(k < 5){
        cout << 0;
    }
    else{
        solve(k-5, -1, learn);
        cout << ans;
    }
    return 0;
}

주어진 단어를 순서대로 호출하며 동시에 학습을 진행하려고 하다보니, 호출하는 순서까지 고려해야하므로 경우의 수가 너무 많았다.

선형 자료구조에 저장된 값들을 알맞은 순서대로 참조해나가는 일반적인 틀에 갇혀 올바른 방법을 생각해내지 못했던 것 같다.

26개의 알파벳 중 k개가 학습되었을 때 읽을 수 있는 알파벳의 개수를 센다면, "anta", "tica" 의 구성 알파벳 5개를 제외한 21개의 알파벳에서 k-5개를 고르는 경우의 수(조합)와 같으므로 완전탐색으로도 제한시간안에 통과할 수 있다. 이때 단어를 비트마스크 기법을 적용하여 정수 형태로 저장한다면 효율을 훨씬 높일 수 있다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 2098번 외판원 순회  (0) 2020.10.10
Baekjoon 1256번 사전  (0) 2020.10.09
Baekjoon 14569번 시간표 짜기  (0) 2020.10.07
Baekjoon 14226번 이모티콘  (0) 2020.10.07
Baekjoon 1405번 미친 로봇  (0) 2020.10.05

댓글