-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Gold III] Title: 거짓말쟁이, Time: 0 ms, Memory: 2020 KB -BaekjoonHub
- Loading branch information
Showing
2 changed files
with
102 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# [Gold III] 거짓말쟁이 - 12905 | ||
|
||
[문제 링크](https://www.acmicpc.net/problem/12905) | ||
|
||
### 성능 요약 | ||
|
||
메모리: 2020 KB, 시간: 0 ms | ||
|
||
### 분류 | ||
|
||
해 구성하기, 다이나믹 프로그래밍 | ||
|
||
### 제출 일자 | ||
|
||
2024년 4월 5일 21:07:41 | ||
|
||
### 문제 설명 | ||
|
||
<p>BOJ 알고리즘 캠프에 참가한 사람 N명이 교실의 앞에 모여서 원형으로 앉아있다. 각 사람은 반시계 방향으로 0번부터 N-1번까지 번호가 매겨져 있다.</p> | ||
|
||
<p>캠프에 참가한 모든 사람은 정직한 사람이거나 거짓말쟁이이다. 정직한 사람은 항상 사실만을 말하고, 거짓말쟁이는 항상 거짓만을 말한다.</p> | ||
|
||
<p>백준이는 사람들에게 오른쪽에 앉아있는 사람이 거짓말쟁이인지 묻는 질문을 했다. 정직한 사람은 정직하게 거짓말쟁이는 거짓말로 대답을 한다. 정직한 사람과 거짓말쟁이 모두 답변을 거부할 수도 있다.</p> | ||
|
||
<p>사람들의 대답이 주어졌을 때, 그러한 대답이 나오는 정직한 사람과 거짓말쟁이의 조합이 존재하면, 거짓말쟁이 수의 최솟값을, 가능한 조합이 없으면 -1을 출력하는 프로그램을 작성하시오.</p> | ||
|
||
### 입력 | ||
|
||
<p>첫째 줄에 사람의 수 N이 주어진다. (2 ≤ N ≤ 50)</p> | ||
|
||
<p>둘째 줄에는 사람들의 답변이 주어진다.</p> | ||
|
||
<p>답변이 L인 경우에는 거짓말쟁이라고, H인 경우에는 정직한 사람이라고 대답한 것이고, ?인 경우에는 답변을 거부한 것이다.</p> | ||
|
||
### 출력 | ||
|
||
<p>입력으로 주어진 대답이 나오는 정직한 사람과 거짓말쟁이의 조합이 존재하면, 거짓말쟁이 수의 최솟값을, 가능한 조합이 없으면 -1을 출력한다.</p> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
#include <iostream> | ||
#include <algorithm> | ||
#include <vector> | ||
using namespace std; | ||
|
||
int n; | ||
vector<int> arr; | ||
vector<int> 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; | ||
} |