[문제보기]
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
[풀이과정]
블랙잭 확률 구하기 문제이다.
(1) check(int *card, int card_sum, int sum)
현재 남아있는 card에서 현재의 합의 정보를 가지고 있는 sum에 하나씩 더해서 21보다 크면 stop부분에
21 이하의 합이 나오면 go부분에 해당 카드의 숫자를 더해준다.
연산 후 stop이 go 보다 작으면 true, 크거나 같으면 false를 반환해준다.
(2) main()
Ace를 11, Ten, Jack, Queen, King을 10으로 정했으므로, card행렬을 만들때 10부분에는 16으로,
나머지 가짓수에는 4로 초기화해준다. (이 때, 인덱스가 카드 숫자로 취급/ 인덱스 0과 1은 0으로 초기화)
첫번째 for문에는 승현이가 뽑은 카드를 입력받아 해당 카드를 한장씩 빼준다. 그리고 뽑은 카드에 대해
현재의 합을 구한다.
현재의 합이 21보다 작을 경우 GAZUA가 나올 수 있는 경우가 생길수 있으므로 check()함수를 수행해준다.
그리고 check()로 인해 반환되는 flag가 true이면 GAZUA, false이면 STOP을 출력해준다.
[소스코드]
//카드 게임
#include <iostream>
using namespace std;
bool check(int *card, int sum){
int stop = 0;
int go = 0;
int temp = sum;
for(int i=0; i<12; i++){
sum = temp;
if(card[i] > 0){
sum += i;
if(sum > 21){
stop += card[i];
}
else{
go += card[i];
}
}
}
if(stop < go){
return true;
}
return false;
}
int main(){
cin.tie(0);
cout.sync_with_stdio(false);
int T;
cin >> T;
for(int test = 1; test <= T; test++){
int card[12] = {0,0,4,4,4,4,4,4,4,4,16,4};
int card_sum = 52;
int sum = 0;
int n, x;
cin >> n;
for(int i=0; i<n; i++){
cin >> x;
card[x]--;
sum += x;
}
card_sum -= n;
bool flag = false;
if(sum < 21)
flag = check(card, sum);
cout << "#" << test << " " ;
if(flag){
cout << "GAZUA" << "\n";
}
else{
cout << "STOP" << "\n";
}
}
}
[해결과정 중 실수한 부분]
33개의 테스트 케이스 중에 32개만 맞혔다고 결과가 나와서 그 부분을 수정하는데 4번 정도 기회를 썼다.
결국 찾아냈는데, 처음 코드에는 check()함수 안의 stop과 go의 변수에 +1씩만 더해줘서 결과를 비교를 했다.
수정을 하여 stop과 go변수에 +1이 아니라, 해당 카드가 뒤집혀 남아 있는 숫자를 더해줬어야 했다.
예를 들어, 합이 15일때 5의 숫자를 가지고 있는 카드를 뽑았을 때 21보다 작은 수가 되므로 go변수를
수정해줘햐 한다. 이 때 5의 숫자를 가지고 있는 해당 카드가 뒤집혀 있는 개수를 더해줘야한다.
이 부분을 찾는데 그리 많은 시간이 걸리지는 않았지만, 처음 코드를 짰을 때, 이 부분을 놓쳤던거에 대해
너무 아쉬웠다ㅠㅠㅠ
[+추가]
check() 함수없이 간단히 하는 방법
int x;
for(int i=0; i<n; i++){
cin >> x;
card[x]--;
sum += x;
}
cnt = 21 - sum;
for(int i=2; i<=cnt; i++)
go += card[i];
for(int i= cnt+1; i<12; i++)
stop += card[i];
if(stop > go)
cout << ~~~~
이런 씩으로 main()을 고쳤으면 check()함수로 빼지 않고 한번에 처리가 가능하다.
참고한 자료
'알고리즘 스터디 > SW_Expert_Academy' 카테고리의 다른 글
| [SWEA 8275][C++] 햄스터(D4) (0) | 2020.07.24 |
|---|---|
| [SWEA 884][C++] 아바바바(D3) (0) | 2020.07.21 |
| [SWEA 9480][C++] 민정이와 광직이의 알파벳 공부(D3) (0) | 2020.07.16 |
| [SWEA 9317][C++] 석찬이의 받아쓰기(D3) (0) | 2020.07.16 |
| [SWEA 9229][C++] 한빈이와 Spot Mart(D3) (0) | 2020.07.14 |