Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

혼종 꼬지마루

[SWEA] 4223 - 삼성이의 트라우마 본문

Algorithms/DFS

[SWEA] 4223 - 삼성이의 트라우마

꼬지마루 2018. 9. 8. 20:36

https://www.swexpertacademy.com/main/code/userProblem/userProblemDetail.do?contestProbId=AWKpmwua-VoDFAUV

(이 글이 문제가 될 시 삭제하도록 하겠습니다.)


과거 삼성전자 SW Test A형을 딸 때 1시간 만에 풀었는데 복원문제라는 소문 듣고 풀어봤다


아주 살짝 더 쉬운 문제인데... 더 오래걸린... 이제 코딩아이디어가 빠르게 안되나보다...


1. SAMSUNG 문자열을 target배열에 각 문자의 갯수를 저장한다.


2. 그리고 나서 L, 면접관 이름, 점수 P를 입력받는다.


3. 조합으로 dfs탐색


   이때 중요한 것은 check배열에 면접관의 이름에 있는 문자의 갯수를 더하고 빼주며 검사한다


4. 매번 검사하며, target에 있는 문자의 갯수보다 작으면 그냥 넘어가고, 갯수가 충분하다면 최소값 찾고 리턴


5. 만들 수 없는 조건은 모두 더했을 때, 즉 깊이가 N과 같고, 갯수가 불충분한 경우 뿐!


   여기서 flag를 달아서 바로 리턴시켜도 되지만 귀찮아서 그냥 답이 초기값과 같으면 -1을 출력했다.


   이거 조절하면 시간을 더 줄일 수 있을 듯


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
#include <iostream>
#include <cstring>
#include <memory.h>
#define MX 12
#define INF 987654321
using namespace std;
 
int check[30], target[30], LP[MX][2];
char str[MX][MX];
int T, N, P, L, dab;
 
bool make()
{
    for (int i = 0; i < 26; i++)
        if (target[i] > check[i]) return false;
    return true;
}
 
void dfs(int d, int pos, int sum)
{
    if (d == N && !make()) return;
    if (make())
    {
        if (dab > sum) dab = sum;
        return;
    }
 
    for (int i = pos; i < N; i++)
    {
        for (int j = 0; j < LP[i][0]; j++)
            check[str[i][j] - 'A']++;
        dfs(d + 1, i + 1, sum + LP[i][1]);
        for (int j = 0; j < LP[i][0]; j++)
            check[str[i][j] - 'A']--;
    }
}
 
int main(void)
{
    char tmp[10= { "SAMSUNG" };
    for (int i = 0; i < strlen(tmp); i++)
        target[tmp[i] - 'A'++;
 
    cin >> T;
    for (int tc = 1; tc <= T; tc++)
    {
        memset(str, 0sizeof(str));
        memset(LP, 0sizeof(LP));
        dab = INF;
        cin >> N;
 
        for (int i = 0; i < N; i++)
        {
            cin >> LP[i][0];
            for (int j = 0; j < LP[i][0]; j++)
                cin >> str[i][j];
            cin >> LP[i][1];
        }
        dfs(000);
        cout << "#" << tc << " ";
        if (dab == INF) cout << -<< endl;
        else cout << dab << endl;
    }
    return 0;
}
cs

'Algorithms > DFS' 카테고리의 다른 글

[백준] 3109 - 빵집  (0) 2018.09.17
[백준] 3967 - 매직스타  (0) 2018.09.14
[백준] 14889 - 스타트와 링크  (0) 2018.09.07
[백준] 9997 - 폰트  (0) 2018.08.31
[백준] 1208 - 부분집합의 합2  (0) 2018.08.29