<링크>
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 = 0; break; case 0x06:num = 1; break; case 0x5B:num = 2; break; case 0x4F:num = 3; break; case 0x27:num = 4; break; case 0x6D:num = 5; break; case 0x7D:num = 6; break; case 0x46:num = 7; break; case 0x7F:num = 8; break; case 0x6F:num = 9; break; 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개이하로 고장난 상황을 체크하였다.
'알고리즘 풀이 > 브루트 포스' 카테고리의 다른 글
백준 15686 치킨배달 (0) | 2018.09.30 |
---|---|
백준 1107 리모컨 (2) | 2018.07.26 |
백준 1421 나무꾼 이다솜 ::들짐승 (0) | 2018.07.22 |
백준 14888 연산자 끼워넣기 :: 들짐승 (0) | 2018.07.22 |