728x90

문제 설명

카드게임이 있다. 게임에 사용하는 각 카드에는 양의 정수 하나가 적혀있고 같은 숫자가 적힌 카드는 여러 장 있을 수 있다. 게임방법은 우선 짝수개의 카드를 무작위로 섞은 뒤 같은 개수의 두 더미로 나누어 하나는 왼쪽에 다른 하나는 오른쪽에 둔다.

각 더미의 제일 위에 있는 카드끼리 서로 비교하며 게임을 한다. 게임 규칙은 다음과 같다. 지금부터 왼쪽 더미의 제일 위 카드를 왼쪽 카드로, 오른쪽 더미의 제일 위 카드를 오른쪽 카드로 부르겠다.

1. 언제든지 왼쪽 카드만 통에 버릴 수도 있고 왼쪽 카드와 오른쪽 카드를 둘 다 통에 버릴 수도 있다. 이때 얻는 점수는 없다. 2. 오른쪽 카드에 적힌 수가 왼쪽 카드에 적힌 수보다 작은 경우에는 오른쪽 카드만 통에 버릴 수도 있다. 오른쪽 카드만 버리는 경우에는 오른쪽 카드에 적힌 수만큼 점수를 얻는다. 3. (1)과 (2)의 규칙에 따라 게임을 진행하다가 어느 쪽 더미든 남은 카드가 없다면 게임이 끝나며 그때까지 얻은 점수의 합이 최종 점수가 된다.

왼쪽 더미의 카드에 적힌 정수가 담긴 배열 left와 오른쪽 더미의 카드에 적힌 정수가 담긴 배열 right가 매개변수로 주어질 때, 얻을 수 있는 최종 점수의 최대값을 return 하도록 solution 함수를 작성하시오.

제한 사항

  • 한 더미에는 1장 이상 2,000장 이하의 카드가 있다.
  • 각 카드에 적힌 정수는 1 이상 2,000 이하이다.

입출력 예

leftrightreturn

[3, 2, 5] [2, 4, 1] 7

입출력 예 설명

먼저 오른쪽 카드를 버려서 2점을 획득한다.
그 뒤 왼쪽 카드를 두 장 버리고 오른쪽 카드를 버려서 4점을 획득한다.
마지막으로 오른쪽 카드를 버려서 1점을 획득한다.
총 얻을 수 있는 점수는 7점이다.


조건에 따라 카드 게임을 해서 얻을 수 있는 최대 점수를 구하는 문제이다. 

조건은 크게 어렵지 않고 시간 초과를 조심해야 하는 문제이다.

vector를 매개변수로 넘겼더니 시간 초과가 떴다.

전역 변수 vector를 선언한 후 복사해서 해결했다.

 

dfs를 통해 가능한 모든 조합을 방문해서 얻을 수 있는 최대 점수를 구한다.

왼,오른쪽 카드를 모두 버리거나, 왼쪽 카드를 버리는 건 모든 경우에서 가능하므로 무조건 실행하고,

오른쪽 카드가 더 작을경우에만 오른쪽 카드를 버리게 한다.

 

한 쪽 카드를 모두 버리면 더 얻을 수 있는 점수가 없으므로 0을 반환한다.

 

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/Programmers/%EC%B9%B4%EB%93%9C%20%EA%B2%8C%EC%9E%84.cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

C++ 코드

#include <cstring>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int dp[2001][2001];
vector<int> l;
vector<int> r;
int dfs(int li, int ri)
{
	if (li >= l.size() || ri >= r.size()) return 0;
	if (dp[li][ri] > 0) return dp[li][ri];
	
	dp[li][ri] = max(dfs(li + 1, ri + 1), dfs(li + 1, ri));
	if (l[li] > r[ri]) dp[li][ri] = max(dp[li][ri], r[ri] + dfs(li, ri + 1));
	return dp[li][ri];
}

int solution(vector<int> left, vector<int> right) {
	int answer = 0;
	memset(dp, -1, sizeof(dp));
	l = left;
	r = right;
	answer = dfs(0, 0);
	return answer;
}

int main()
{
	cout << solution({ 3,2,5 }, { 2,4,1 });
}
728x90

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 도둑질  (0) 2020.06.05
[프로그래머스] 순위  (0) 2020.06.03
[프로그래머스] 섬 연결하기  (0) 2020.05.29
[프로그래머스] 저울  (0) 2020.05.27
[프로그래머스] 단속카메라  (0) 2020.05.27

+ Recent posts