CLOCKSYNC
처음에는 CLOCK 값을 증가시키면서 , CLOCK을 12시에 맞추고 다음 CLOCK 으로 이동하고 이런 방식을 생각했었는데
이런식으로는 계속 문제가 꼬여가서 풀 수 없다고 생각해서 다시 생각해보았다.
BUTTON 중심으로 접근하다 보니, 0~9번 까지의 버튼을 몇번 누르는지에 대한 재귀 접근으로 풀 수 있었다.
그리고 가장 중요한 방법은 최소값을 구하는 것이고, 한 버튼을 0번 누르나 4번 누르나 똑같다는 점이었다.
따라서 최소값을 구하기 위해서는 버튼은 최대 3번까지만 누르는 방식으로 재귀함수 코드를 구현할 수 있었다.
또 모든 버튼을 3번씩 누르면 최대 3*16=48번의 버튼을 누를 수 있기 때문에, 기존의 ans 값을 50으로 설정하였다.
search_button 함수를 통해서 몇번 버튼을 몇번 누를 것인지를 정하고,
change_clock 함수를 통해서 그 버튼을 몇번 눌렀을 때, 시간을 변경해주는 방식으로 구현했다.
<정답 코드 - C>
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include<stdio.h> #define clock_num 16 #define button_num 10 //버튼에 따른 연결된 스위치, 연결이 되지 않았으면 -1 const int button[button_num][5] = { {0,1,2,-1,-1}, {3,7,9,11,-1}, {4,10,14,15,-1}, {0,4,5,6,7}, {6,7,8,10,12}, {0,2,14,15,-1}, {3,14,15,-1,-1}, {4,5,7,14,15}, {1,2,3,4,5}, {3,4,5,9,13} }; void change_clock(int *clock, int button_index, int move_time); void search_button(int *clock,int clock_index,int cnt,int *ans); int main() { //freopen("input.txt", "r", stdin); int tc, t, i; int ans; int clock[16]; scanf("%d", &tc); for (t = 1; t <= tc; t++) { ans = 50; for (i = 0; i < clock_num; i++) { scanf("%d", &clock[i]); } search_button(clock,0,0,&ans); //정답을 구할 수 없는 경우 if (ans == 50) ans = -1; printf("%d\n", ans); } return 0; } //해당 버튼의 타이머들 변경하기 void change_clock(int *clock,int button_index,int move_time) { int i, num; //버튼에 연결된 스위치 탐색 for (i = 0; i < 5; i++) { //num 는 버튼에 연결되어 있는 스위치 인덱스 num = button[button_index][i]; if (num != -1) { //시계 값 변경 clock[num] += move_time; if (clock[num] <= 0) clock[num] += 12; if (clock[num] > 12) clock[num] -= 12; } } } void search_button(int *clock,int button_index,int cnt,int *ans) { int i,j; //기존의 정답보다 값이 클 때 if (cnt >= *ans) return; //모든 버튼을 다 해봤을 때 if (button_index == button_num) { for (j = 0; j < clock_num; j++) { if (clock[j] != 12) return; } if (*ans > cnt) { *ans = cnt; } return; } //버튼을 몇번누르는지 for (i = 0; i < 4; i++) { //butto_index 번 버튼을 i번 눌렀을 경우 change_clock(clock, button_index, 3 * i); search_button(clock, button_index + 1, cnt + i, ans); change_clock(clock, button_index, -3 * i); } } | cs |
반응형
'알고리즘 > Algospot' 카테고리의 다른 글
JUMPGAME(C언어) (0) | 2018.07.04 |
---|---|
DICTIONARY (0) | 2018.07.03 |
BOARDCOVER(C언어) (0) | 2018.06.27 |
PICNIC (C언어) (0) | 2018.06.25 |
28.2 문제: 고대어 사전(문제 ID: DICTIONARY) (0) | 2017.12.07 |