diff --git "a/\353\260\261\354\244\200/Gold/12905.\342\200\205\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264/README.md" "b/\353\260\261\354\244\200/Gold/12905.\342\200\205\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264/README.md" new file mode 100644 index 0000000..a25a04c --- /dev/null +++ "b/\353\260\261\354\244\200/Gold/12905.\342\200\205\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264/README.md" @@ -0,0 +1,38 @@ +# [Gold III] 거짓말쟁이 - 12905 + +[문제 링크](https://www.acmicpc.net/problem/12905) + +### 성능 요약 + +메모리: 2020 KB, 시간: 0 ms + +### 분류 + +해 구성하기, 다이나믹 프로그래밍 + +### 제출 일자 + +2024년 4월 5일 21:07:41 + +### 문제 설명 + +

BOJ 알고리즘 캠프에 참가한 사람 N명이 교실의 앞에 모여서 원형으로 앉아있다. 각 사람은 반시계 방향으로 0번부터 N-1번까지 번호가 매겨져 있다.

+ +

캠프에 참가한 모든 사람은 정직한 사람이거나 거짓말쟁이이다. 정직한 사람은 항상 사실만을 말하고, 거짓말쟁이는 항상 거짓만을 말한다.

+ +

백준이는 사람들에게 오른쪽에 앉아있는 사람이 거짓말쟁이인지 묻는 질문을 했다. 정직한 사람은 정직하게 거짓말쟁이는 거짓말로 대답을 한다. 정직한 사람과 거짓말쟁이 모두 답변을 거부할 수도 있다.

+ +

사람들의 대답이 주어졌을 때, 그러한 대답이 나오는 정직한 사람과 거짓말쟁이의 조합이 존재하면, 거짓말쟁이 수의 최솟값을, 가능한 조합이 없으면 -1을 출력하는 프로그램을 작성하시오.

+ +### 입력 + +

첫째 줄에 사람의 수 N이 주어진다. (2 ≤ N ≤ 50)

+ +

둘째 줄에는 사람들의 답변이 주어진다.

+ +

답변이 L인 경우에는 거짓말쟁이라고, H인 경우에는 정직한 사람이라고 대답한 것이고, ?인 경우에는 답변을 거부한 것이다.

+ +### 출력 + +

입력으로 주어진 대답이 나오는 정직한 사람과 거짓말쟁이의 조합이 존재하면, 거짓말쟁이 수의 최솟값을, 가능한 조합이 없으면 -1을 출력한다.

+ diff --git "a/\353\260\261\354\244\200/Gold/12905.\342\200\205\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264/\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264.cc" "b/\353\260\261\354\244\200/Gold/12905.\342\200\205\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264/\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264.cc" new file mode 100644 index 0000000..31a5bd4 --- /dev/null +++ "b/\353\260\261\354\244\200/Gold/12905.\342\200\205\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264/\352\261\260\354\247\223\353\247\220\354\237\201\354\235\264.cc" @@ -0,0 +1,64 @@ +#include +#include +#include +using namespace std; + +int n; +vector arr; +vector result; +int minLiar = 100000000; + +void dfs(int idx, int liar) { + if (liar >= minLiar) return; + if (idx >= n) { + if (arr[n-1] == -1) { + minLiar = min(liar, minLiar); + return; + } + if (result[n-1]) { + if (arr[n-1] == result[0]) minLiar = min(liar, minLiar); + } + else { + if (arr[n-1] != result[0]) minLiar = min(liar, minLiar); + } + return; + } + if (arr[idx-1] == -1) { + result[idx] = 1; + dfs(idx+1, liar); + result[idx] = 0; + dfs(idx+1, liar+1); + return; + } + if (result[idx-1]) { + result[idx] = arr[idx-1]; + } else { + result[idx] = !arr[idx-1]; + } + if (!result[idx]) liar++; + dfs(idx+1, liar); + return; +} + +int main() +{ + ios_base::sync_with_stdio(0); + cin.tie(0); + //freopen("input.txt", "r", stdin); + + cin >> n; + arr.assign(n, 0); + result.assign(n, 0); + char t; + for (int i = 0; i < n; i++) { + cin >> t; + if (t == 'H') arr[i] = 1; + if (t == '?') arr[i] = -1; + } + dfs(1, 1); + result[0] = 1; + dfs(1, 0); + if (minLiar == 100000000) minLiar = -1; + cout << minLiar; + return 0; +} \ No newline at end of file