while(1) work();
반응형

링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWBnFuhqxE8DFAWr 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

분류

캐싱

비트연산

재귀

 

개인적 난이도

매우 쉬움 쉬움 보통 어려움 매우 어려움

 

핵심 알고리즘

다음날 동아리 출근여부를 1, 0으로 표현한다고 했을 때

인원이 4명으로 제한되어있으므로 동아리 출근여부는 0000 ~ 1111 로 표현 가능하다.

동아리 열쇠 소지자도 마찬가지로 이진수로 표현하면

비트 연산을 통해 답을 구할 수 있다.

 

시행착오

없음

 

코드


#include<iostream>

using namespace std;

string str;
int len;
int** cache;

int c2i(int i) {
    char c = str[i];

    if (c == 'A') return 8;
    if (c == 'B') return 4;
    if (c == 'C') return 2;
    return 1;
}

int solve(int i, int key) {
    if (cache[i][key] > 0) return cache[i][key];
    if (i >= len) return 0;

    int must = c2i(i), result = 0;

    for (int j = 1; j <= 16; j++) {
        if ((must & j) > 0 && (key & j) > 0) {

            if (i == len - 1) result++;
            else result = (result + solve(i + 1, j)) % 1000000007;
        }
    }

    cache[i][key] = result;
    return result;
}

int main(int argc, char** argv)
{
    int test_case;
    int T;
    cin >> T;

    for (test_case = 1; test_case <= T; ++test_case)
    {
        cin >> str;
        len = str.size();
        cache = new int* [len + 1];
        for (int i = 0; i <= len; i++) {
            cache[i] = new int[16];
            for (int j = 0; j < 16; j++) cache[i][j] = -1;
        }

        printf("#%d %d\n", test_case, solve(0, 8));
    }

    return 0;
}
반응형

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

4408. 자기 방으로 돌아가기  (0) 2022.02.16
1970. 쉬운 거스름돈  (0) 2022.02.16
1230. 암호문3  (0) 2022.02.16
10726. 이진수 표현  (0) 2022.02.16
1288. 새로운 불면증 치료법  (0) 2022.02.16
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그