Study hard

(c++)백준 14238번: 출근 기록 본문

백준/DP

(c++)백준 14238번: 출근 기록

Nimgnoej 2020. 9. 18. 21:05

www.acmicpc.net/problem/14238

 

14238번: 출근 기록

스타트링크에는 세명의 직원이 일을 하고 있다. 세 직원의 이름은 강호(A), 준규(B), 수빈(C) 이다. 이 회사의 직원은 특별한 룰을 가지고 있는데, 바로 하루에 한 명만 출근한다는 것이다. 3일간의

www.acmicpc.net

[풀이]

재귀 DP를 이용하여 풀 수 있는 문제였다.

(bool) DP[a][b][c][pp][p] : A가 기록을 a번, B는 b번, C는 c번 했고 전전날 pp가 기록을 했고 전날 p가 기록을 한 경우가 가능한지

 

#include <iostream>
#include <string>
using namespace std;

int worker[3];//0:A, 1:B, 2:C 입력받은 횟수 저장
bool DP[51][51][51][3][3] = { false, };//A기록 횟수, B기록 횟수, C기록 횟수, 이틀 전 기록, 어제 기록
char res[51];
string S;

bool solution(int a, int b, int c, int pp, int p) {
	if (a == worker[0] && b == worker[1] && c == worker[2])
		return true;
	//이미 구한 거
	if (DP[a][b][c][pp][p])return false;
	DP[a][b][c][pp][p] = true;

	if (a + 1 <= worker[0]) {
		res[a + b + c] = 'A';
		if (solution(a + 1, b, c, p, 0))
			return true;
	}
	if (b + 1 <= worker[1]) {
		res[a + b + c] = 'B';
		if (p != 1 && solution(a, b + 1, c, p, 1))
			return true;
	}
	if (c + 1 <= worker[2]) {
		res[a + b + c] = 'C';
		if (pp != 2 && p != 2 && solution(a, b, c + 1, p, 2))
			return true;
	}
	return false;
}

int main() {
	cin >> S;
	for (int i = 0; i < S.size(); i++) {
		if (S[i] == 'A')
			worker[0]++;
		else if (S[i] == 'B')
			worker[1]++;
		else
			worker[2]++;
	}
	if (solution(0, 0, 0, -1, -1))
		for (int i = 0; i < S.size(); i++)
			cout << res[i];
	else
		cout << -1;
	cout << '\n';
	
	return 0;
}

[참고]

imnotabear.tistory.com/34

 

[백준 14238] 출근 기록 (C++)

문제 링크: https://www.acmicpc.net/problem/14238 14238번: 출근 기록 스타트링크에는 세명의 직원이 일을 하고 있다. 세 직원의 이름은 강호(A), 준규(B), 수빈(C) 이다. 이 회사의 직원은 특별한 룰을 가지고.

imnotabear.tistory.com

 

'백준 > DP' 카테고리의 다른 글

(c++)백준 12996번: Acka  (0) 2020.09.19
(c++)백준 12026번: BOJ거리  (0) 2020.09.18
(c++)백준 5557번: 1학년  (0) 2020.09.18
(c++)백준 11049번: 행렬 곱셈 순서  (0) 2020.09.16
(c++)백준 1890번: 점프  (0) 2020.09.16