diff --git "a/minyoung/week6/\353\212\221\353\214\200\353\254\270\354\240\234.c" "b/minyoung/week6/\353\212\221\353\214\200\353\254\270\354\240\234.c" new file mode 100644 index 0000000..fbfc632 --- /dev/null +++ "b/minyoung/week6/\353\212\221\353\214\200\353\254\270\354\240\234.c" @@ -0,0 +1,90 @@ +#include +#include + +int info[18]; +int edges[20][2]; +int n; +int edge_len; +int graph[18][18]; +int graph_cnt[18]; +int max_sheep = 0; +int visited[18]; +void do_run(); +void do_print(); +void reset_state(); +void dfs(int node, int sheep, int wolf); + +int main() { + + scanf("%d", &n); + + for (int i = 0; i < n; i++) { + scanf("%d", &info[i]); + } + + edge_len = n - 1; + for (int i = 0; i < edge_len; i++) { + scanf("%d %d", &edges[i][0], &edges[i][1]); + } + + + do_run(); + do_print(); +} + +void do_run() { + reset_state(); + + for (int i = 0; i < edge_len; i++) { + int from = edges[i][0]; + int to = edges[i][1]; + + graph[from][graph_cnt[from]++] = to; + } + + dfs(0, 0, 0); +} + +void do_print() { + printf("%d\n", max_sheep); +} + +void reset_state() { + max_sheep = 0; + + for (int i = 0; i < 18; i++) { + graph_cnt[i] = 0; + visited[i] = 0; + } +} + +void dfs(int node, int sheep, int wolf) { + visited[node] = 1; + if (info[node] == 0) + sheep++; + else + wolf++; + + // 늑대가 같, 많아지면 중단 + if (wolf >= sheep) { + visited[node] = 0; + return; + } + + // 최대 양 수 업데이트 + if (sheep > max_sheep) + max_sheep = sheep; + + // 탐색진행 + for (int i = 0; i < n; i++) { + if (visited[i]) { + for (int j = 0; j < graph_cnt[i]; j++) { + int next = graph[i][j]; + if (!visited[next]) { + dfs(next, sheep, wolf); + } + } + } + } + visited[node] = 0; +} diff --git "a/minyoung/\353\201\235\353\247\220\354\236\207\352\270\260.c" "b/minyoung/\353\201\235\353\247\220\354\236\207\352\270\260.c" new file mode 100644 index 0000000..cd50e5e --- /dev/null +++ "b/minyoung/\353\201\235\353\247\220\354\236\207\352\270\260.c" @@ -0,0 +1,101 @@ +#include +#include + +int n; +int words_len; +char words[101][51]; +char used[101][51]; +int used_cnt = 0; +int out_person = 0; +int out_turn = 0; + +void do_run(); +void do_print(); +void reset_state(); +int is_duplicate(char *word); +int is_invalid_link(char *prev, char *cur); + +int main() { + + scanf("%d", &n); + scanf("%d", &words_len); + + for (int i = 0; i < words_len; i++) { + scanf("%s", words[i]); + } + + do_run(); + do_print(); +} + +void do_run() { + reset_state(); + + char prev[51] = ""; + for (int i = 0; i < words_len; i++) { + + int person = (i % n) + 1; + int turn = (i / n) + 1; + + // 한 글자 단어 체크 + if (strlen(words[i]) < 2) { + out_person = person; + out_turn = turn; + return; + } + + // 중복인지 확인 + if (is_duplicate(words[i])) { + out_person = person; + out_turn = turn; + return; + } + + // 끝말잇기 계속 가능한지 확인 + if (i > 0 && is_invalid_link(prev, words[i])) { + out_person = person; + out_turn = turn; + return; + } + + // 정상일때 + strcpy(used[used_cnt], words[i]); + used_cnt++; + strcpy(prev, words[i]); + } +} + +void do_print() { + printf("%d %d\n", out_person, out_turn); +} + +// 초기화 +void reset_state() { + used_cnt = 0; + out_person = 0; + out_turn = 0; + + for (int i = 0; i < 101; i++) { + used[i][0] = '\0'; + } +} + +// 중복인지 확인 함수 +int is_duplicate(char *word) { + for (int i = 0; i < used_cnt; i++) { + if (strcmp(used[i], word) == 0) + return 1; + } + return 0; +} + +// 끝말잇기 연결 검사 +int is_invalid_link(char *prev, char *cur) { + int len = strlen(prev); + char last = prev[len -1]; + char first = cur[0]; + + if (last != first) + return 1; + return 0; +}