Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions minyoung/week6/늑대문제.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#include <stdio.h>
#include <string.h>

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;
}
101 changes: 101 additions & 0 deletions minyoung/끝말잇기.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#include <stdio.h>
#include <string.h>

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;
}