Skip to content

Commit

Permalink
[Gold III] Title: 거짓말쟁이, Time: 0 ms, Memory: 2020 KB -BaekjoonHub
Browse files Browse the repository at this point in the history
  • Loading branch information
belowyoon committed Apr 5, 2024
1 parent 367241e commit 932f942
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 0 deletions.
38 changes: 38 additions & 0 deletions 백준/Gold/12905. 거짓말쟁이/README.md
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>

64 changes: 64 additions & 0 deletions 백준/Gold/12905. 거짓말쟁이/거짓말쟁이.cc
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;
}

0 comments on commit 932f942

Please sign in to comment.