이게 대체 무슨코든지 모르겠슴

  • cjkis
    cjkis

    http://algospot.com/judge/problem/read/CLOCKSYNC

    #include<stdio.h>
    
    int sw[10][16] = {
        {3,3,3},
        {0,0,0,3,0,0,0,3,0,3,0,3},
        {0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,3},
        {3,0,0,0,3,3,3,3},
        {0,0,0,0,0,0,3,3,3,0,3,0,3},//
        {3,0,3,0,0,0,0,0,0,0,0,0,0,0,3,3},
        {0,0,0,3,0,0,0,0,0,0,0,0,0,0,3,3},
        {0,0,0,0,3,3,0,3,0,0,0,0,0,0,3,3},
        {0,3,3,3,3,3},
        {0,0,0,3,3,3,0,0,0,3,0,0,0,3}
    };
    int T, a[16], ans;
    
    int calc(int clock)
    {
        if(clock == 3) return 3;
        if(clock == 6) return 2;
        if(clock == 9) return 1;
        return 0;
    }
    
    int main()
    {
        int i, j, tmp;
        scanf("%d", &T);
        for(i = 1; i <= T; i++){
            for(j = 0; j < 16; j++){
                scanf("%d", &a[j]);
                a[j] %= 12;
            }
            ans = tmp = calc(a[12]);
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[4][j]) % 12;
            }
            ans += (tmp = calc(a[13]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[9][j]) % 12;
            }
            ans += (tmp = calc(a[6]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[3][j]) % 12;
            }
            ans += (tmp = calc(a[9]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[1][j]) % 12;
            }
            ans += (tmp = calc(a[10]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[2][j]) % 12;
            }
            ans += (tmp = calc(a[7]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[7][j]) % 12;
            }
            ans += (tmp = calc(a[4]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[8][j]) % 12;
            }
            ans += (tmp = calc(a[3]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[6][j]) % 12;
            }
            ans += (tmp = calc(a[1]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[0][j]) % 12;
            }
            ans += (tmp = calc(a[0]));
            for(j = 0; j <16; j++){
                a[j] = (a[j] + tmp * sw[5][j]) % 12;
            }
            for(j = 0; j <16; j++){
                if(a[j] != 0)break;
            }
            if(j == 16)
                printf("%d\n", ans);
            else
                printf("-1\n");
        }
    }
    

    제가 이문제를 알고리즘문제해결전략책보고 풀어서 1000ms나왔는데영, 어떤 사람이 올린 답보니깐 3ms만에 푼거에염

    너무 신기해서 이분이 작성한 소스를 분석할려는데 도저히 이해가안가여

    a[12] 랑 sw[4]랑 연관되어있고,
    a[13] 랑 sw[9]랑 연관되어있고,
    ...

    이런식으로 푼거같은데 어떻게 저렇게해서 답이 구해질 수 있죠?
    for문안에있는 a[j] + tmp * sw[1][j]이런게 대체 무슨뜻이예요?


    10년 전
5개의 댓글이 있습니다.
  • Being
    Being

    파악을 맞게 해 나가고 계셨네요. 12번 시계를 돌리려면 어떤 스위치들이 필요한지 곰곰히 생각해 보시면 금방 찾아내실 것 같네요~


    10년 전 link
  • tjkim
    tjkim

    제출한 소스코드 볼수도 있나요?
    아니면 그분에게 직접 요청해서 받으셨나요?


    10년 전 link
  • cjkis
    cjkis

    답맞추면 다른사람소스볼수잇슴


    10년 전 link
  • tjkim
    tjkim

    아 감사합니다. 처음알았네요


    10년 전 link
  • cjkis
    cjkis

    우앙 알아냇다 우헤헤


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.