by SW expert academy
0~9 사이의 숫자 카드에서 임의의 카드 6장을 뽑았을 때, 3장의 카드가 연속적인 번호를 갖는 경우를 run이라 하고, 3장의 카드가 동일한 번호를 갖는 경우를 tripletes이라고 한다. 그리고, 6장의 카드가 run과 tripletes로만 구성된 경우를 Baby-Gin이라고 하는데, 6자리의 숫자를 입력 받아 Baby-Gin 여부를 판단하는 프로그램을 작성해 보자.
예)
667767은 두 개의 triplet이므로 Baby-Gin이다.(666, 777)
054060은 한 개의 run과 한 개의 triplet이므로 Baby-Gin이다. (456, 000)
101123은 한 개의 triplet가 존재하나, 023이 run이 아니므로 Baby-Gin이 아니다.
입력
첫 번째 줄에 전체 테스트 케이스의 수 T(1<=T<=100)가 주어진다. 각 테스트 케이스는 6자리의 숫자가 들어온다.
입력 예시
3 // 전체 테스트 케이스의 수
667767
054060
101123
출력
입력된 테스트 케이스가 Baby-Gin이면 Baby Gin, 아니면 Lose 출력
출력 예시
Baby Gin
Baby Gin
Lose
✨ 나의 풀이
#include<stdio.h>
int card[10] = {0, }; // 0에서 9까지 숫자 카드
int tc; // 테스트 케이스 수
int num = 0;
int main() {
scanf_s("%d", &tc);
for (int i = 0; i < tc; i++) {
int run = 0, triplete = 0, BabyGin = 0;
for (int i = 0; i < 6; i++) {
scanf_s("%d", &num); // 6자리 숫자
card[num] += 1; // 숫자 갯수 세기
}
for (int i = 0; i < 10; i++) {
if (card[i] >= 3) { // 중복
card[i] -= 3;
if ((card[i] == 1) && (card[i + 1] == 1) && (card[i + 2] == 1)) {
BabyGin = 1;
break;
}
triplete += 1;
}
else if ((card[i] == 1) && (card[i + 1] == 1) && (card[i + 2] == 1)) { // 연속된 3개의 숫자
run += 1;
card[i] = card[i + 1] = card[i + 2] = 0;
}
}
if (run+triplete >1 || BabyGin)
printf("Baby Gin\n");
else
printf("Lose\n");
}
}
0에서 9까지의 인덱스를 가지는 배열 card를 생성한다. 입력값을 card의 인덱스로 하고 갯수를 값으로 한다.
숫자가 3개 이상이면 3을 빼고 현재 값, 다음 값, 그 다음 값이 모두 1로 같으면 BabyGin에 1을 할당하고 break한다.
현재 값, 다음 값, 그 다음 값이 모두 1로 같지 않으면 triplete만 1 증가시킨다.
숫자가 3개 이상이 아니라면 연속된 3개의 숫자인지 확인한다. true면 run을 1증가시키고 연속된 세 숫자는 0으로 할당한다.
run과 triplete의 합이 1보다 크거나 BabyGin이 0이 아니면 Baby Gin을 출력한다.
💎 각 자리 숫자를 counting할 때 나머지 연산과 나눗셈을 이용하고 있다.
'coding test' 카테고리의 다른 글
[C, Python] 2차원 배열 정렬 (0) | 2021.02.25 |
---|---|
[파이썬, C] 절대값의 합 구하기 (0) | 2021.02.23 |
[C] 거스름돈 줄이기 (0) | 2021.02.16 |
[파이썬] Gravity (0) | 2021.02.10 |
[파이썬] 5178. 노드의 합 (0) | 2021.02.08 |