<링크>

https://koitp.org/problem/SDS_TEST_CLOCK/read/


<소스코드>

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
#include<stdio.h>
int ans=0;
void check(int);
int main()
{
    int T;
    scanf("%d"&T);
    for (int t = 1; t <= T; ++t)
    {
        ans = 1439//23:59
        int a;
        int time = 0;
        for (int i = 27; i >= 0--i)
        {
            scanf("%d"&a);
            time = time | (a << i);
        }
        check(time);
        for (int i = 27; i >= 0--i)
        {
            int cVal;
            if (time & (1 << i))
                cVal = (time & ~(1 << i));
            else
                cVal = (time | 1 << i);
            check(cVal);
            for (int j = i - 1; j >= 0--j)
            {
                int dVal=cVal;
                if (dVal & (1 << j))
                    dVal = (dVal & ~(1 << j));
                else
                    dVal = (dVal | 1 << j);
                check(dVal);
            }
        }
 
        printf("#%d %d %d\n",t,ans/60, ans%60);
    }
 
}
void check(int time)
{
    int res[4= { 0, };
    for (int i = 21; i >= 0; i -= 7)
    {
        int num = -1;
        switch ((time & (0x7F << i)) >> i)
        {
        case 0x7E:num = 0break;
        case 0x06:num = 1break;
        case 0x5B:num = 2break;
        case 0x4F:num = 3break;
        case 0x27:num = 4break;
        case 0x6D:num = 5break;
        case 0x7D:num = 6break;
        case 0x46:num = 7break;
        case 0x7F:num = 8break;
        case 0x6F:num = 9break;
 
        default:return//아무숫자도 해당안하면 그건 ㅄ시계니깐 걍리턴
        }
        res[3 - i / 7= num;
    }
    int minute = res[0* 600 + res[1* 60 + res[2* 10 + res[3];
    if (minute < ans)
        ans = minute;
}
cs


<풀이>

int변수 하나에 28비트를 다 때려박은 후 쉬프트 연산을 이용해 풀었다.

각 숫자마다 정해진 7비트가 있기 때문에

16진수표시법으로 비트를 나타내었다.


이중 for문을 돌며 2개이하로 고장난 상황을 체크하였다.





+ Recent posts