본문 바로가기

Problem/Brute force

[C/C++] BOJ 1062 :: 가르침

BOJ 1062 :: 가르침



문제 링크 : https://www.acmicpc.net/problem/1062






ㅠㅠ 2시간 넘게 풀었는데 계속 시간초과가 나서 다른 분들이 푼 것을 참고하여 풀었다..


우선, 내가 시간을 줄이기 위해 고려해준 조건들은


1) 단어의 처음과 끝의 "anta" 와 "tica" 를 제외하고 단어를 저장한다.

2) K가 5보다 작을 경우, a, n, t, i, c 를 읽을 수 없으므로 0을 출력한다.

3) K가 5이상이고 K개의 글자를 가르쳤을 때, 단어 중 가르치지 않은 문자가 포함되어 있다면 바로 다음 단어를 탐색한다.



이와 같다.


그러나 내가 고려해주지 못한 조건들이 있었다.



1) "anta"와 "tica"를 제외할 때 나는 문자 하나하나를 탐색하며 제거해나가 시간이 매우 오래 걸렸다..

==> 이것을 앞 4글자, 뒤 4글자를 떼어내는 방식으로 바꾸어야 했다.

2) 가르칠 수 있는 단어 K가 26일 때, 모든 단어를 읽을 수 있으므로 N을 출력하면 된다.

3) 가르칠 수 있는 알파벳을 체크해나갈 때, 배열의 시작 index를 check한 다음의 index로 갱신해주어야 for문의 범위를 줄일 수 있는데 그 부분을 간과했다. 




세 번째 같은 경우는 정말 기본적인 건데 생각하지 못한 것이 너무 아쉬웠다 ㅠㅠ..


첫 번째 같은 경우, 문자를 하나하나 탐색해가며 앞의 "anta" 뒤의 "tica" 말고도 단어의 중간에 있는 a,n,t,i,c를 제거하려다 보니 이런 구현을 하게 되었는데 조금만 더 생각해서 이러한 구현보다는 앞과 뒤만 떼어내는 것이 더 효율적이라는 것을 빨리 깨달았으면 좋았을 걸 싶다 ㅠㅠ




나의 코드



Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_1062/BOJ_1062.cpp



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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// 백준 알고리즘 1062번 :: 가르침
#include<iostream>
#include<string>
using namespace std;
 
int N, K;
int ans = 0;
string sentence[51];
bool alpha[26];
 
int findmaxwordnum()
{
    int count = 0;
 
    for (int i = 0; i < N; i++)
    {
        bool flag = true;
        int stlen = sentence[i].size();
        for (int j = 0; j < stlen; j++)
        {
            if (!alpha[sentence[i][j] - 'a']) flag = false;
            if (!flag) break;
        }
        if (flag) count++;
    }
    return count;
}
void simulate(int start, int count)
{
    if (count == K - 5) {
        // 읽을 수 있는 문장 개수 구하기
        int numword = findmaxwordnum();
        // ans 갱신하기
        if (ans < numword) ans = numword;
        return;
    }
    // 알파벳 체크하기
    // 내가 고려하지 못한 것!!!!!!!!!!!!!!!!!!!!! (3)
    for (size_t i = start; i < 26; i++)
    {
        if (alpha[i]) continue;
        alpha[i] = true;
        simulate(i+1, count + 1);
        alpha[i] = false;
    }
    return;
}
 
int main()
{
    string str;
    cin >> N >> K;
 
    // 내가 고려하지 못한 것!!!!!!!!!!!!!!!!!!!!! (1)
    for (int i = 0; i < N; i++)
    {
        cin >> str;
        //anta
        str = str.substr(4, str.length());
 
        //tica
        for (int j = 0; j < 4; j++)
            str.pop_back();
 
        sentence[i] = str;
 
    }
 
    // K가 5이상일 때에만 simulate한다.
    // 그렇지 않은 경우는 "anta"+"tica"를 읽을 수 없으므로 0을 출력한다.
    // K가 26일 때에는 모든 단어를 읽을 수 있다.
 
    // 내가 고려하지 못한 것!!!!!!!!!!!!!!!!!!!!! (2)
    if (K == 26) ans = N;
    else if (K >= 5)
    {
        alpha['a' - 'a'= true;
        alpha['n' - 'a'= true;
        alpha['t' - 'a'= true;
        alpha['i' - 'a'= true;
        alpha['c' - 'a'= true;
 
        simulate(0,0);
    }
 
    cout << ans;
 
    return 0;
}
cs


'Problem > Brute force' 카테고리의 다른 글

[C/C++] BOJ 15686 :: 치킨 배달  (0) 2019.02.04
[C/C++] BOJ 14620 :: 꽃길  (0) 2019.01.24
[C/C++] BOJ 1018 :: 체스판 다시 칠하기  (0) 2019.01.21
[C/C++] BOJ 15684 :: 사다리 조작  (0) 2019.01.20
[C/C++] BOJ 15683 :: 감시  (0) 2019.01.13