문제
삼삼 트리플(Samsam-Triple)은 여러 사람이 할 수 있는 게임이다.
이 게임에는 카드를 이용하는데, 카드에는 1에서 9까지의 숫자가 카드에 적혀 있고
적힌 숫자의 색이 빨강(R), 초록(G), 파랑(B)중의 하나로 총 27종류의 카드를 사용한다.
각 종류의 카드는 모두 4장씩 존재하여 총 108장의 카드로 게임을 진행한다.
이 게임에 참가하는 사람들은 9장의 카드를 패로 가져간다.
그리고, 차례를 번갈아 가면서 카드 한 장을 버린 다음 한 장을 새롭게 뽑아오는 것을 반복한다.
이렇게 순서대로 차례를 진행하다가 세 장의 카드로 이루어진 세트를 3개 만든 사람이 승리한다.
각 세트는 동일한 색의 카드 세 장으로 이루어져야 하며, 세 숫자가 모두 같거나, 세 숫자가 모두 연속된 숫자여야 한다.
9와 1은 연속하지 않은 숫자로 생각하여 9, 1, 2가 적힌 세 카드는 한 세트가 될 수 없다.
4, 5, 6가 적힌 세 카드는 한 세트가 될 수 있다.
당신은 이 게임의 모바일 버전을 개발하는 일을 도와 주기로 했다.
9장의 카드에 어떤 숫자가 어떤 색으로 적혀져 있는지 주어질 때
승리 조건을 만족하도록 3개의 세트를 구성할 수 있는지 판별하는 프로그램을 작성해야 한다.
풀이방법
R, G, B 세 개의 배열을 선언하고 0으로 초기화한다.
문자로 이루어진 문자열의 i번 째 문자에 해당하는 배열에
숫자로 이루어진 문자열의 i번 째 숫자에 값을 1씩 증가 시킨다.
123345777
RRRRRRGGG
라는 입력이 주어진다면, 각 배열은 아래와 같이 될 것이다.
R = {1, 1, 2, 1, 1, 0, 0, 0, 0}
G = {0, 0, 0, 0, 0, 0, 3, 0, 0}
B = {0, 0, 0, 0, 0, 0, 0, 0, 0}
그런 다음 2가지 규칙을 적용해 각 배열의 원소값을 감소해나가고, 규칙을 만족할 때마다 카운트 해준다.
1) 같은 색의 숫자 3개가 연속될 경우
2) 같은 색의 같은 숫자가 3개가 있을 경우
위의 입력을 예로 들면
R = {1, 1, 2, 1, 1, 0, 0, 0, 0}
G = {0, 0, 0, 0, 0, 0, 3, 0, 0}
B = {0, 0, 0, 0, 0, 0, 0, 0, 0}
set = 0
R의 세 개의 수가 연속되므로 규칙을 만족하는 각 원소의 값을 1씩 감소시키고, 카운트한다.
R = {0, 0, 1, 1, 1, 0, 0, 0, 0}
G = {0, 0, 0, 0, 0, 0, 3, 0, 0}
B = {0, 0, 0, 0, 0, 0, 0, 0, 0}
set = 1
다음 규칙을 만족하는 원소를 찾는다.
R = {0, 0, 1, 1, 1, 0, 0, 0, 0}
G = {0, 0, 0, 0, 0, 0, 3, 0, 0}
B = {0, 0, 0, 0, 0, 0, 0, 0, 0}
set = 1
------------------------------------
R = {0, 0, 0, 0, 0, 0, 0, 0, 0}
G = {0, 0, 0, 0, 0, 0, 3, 0, 0}
B = {0, 0, 0, 0, 0, 0, 0, 0, 0}
set = 2
이러한 방식으로 규칙을 만족하는 개수를 찾고 규칙을 3번 만족할 때 "Win"을 그렇지 않을 때 "Continue"를 출력한다.
소스코드
package samsung;
import java.util.*;
public class s_6781 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int tc = sc.nextInt();
for(int t = 1; t <= tc; t++) {
String s1 = sc.next();
String s2 = sc.next();
int[][] a = new int[3][10];
int set = 0;
for(int i = 0; i < 9; i++) {
char color = s2.charAt(i);
int idx = s1.charAt(i) - '0';
if(color == 'R')
a[0][idx]++;
else if(color == 'B')
a[1][idx]++;
else if(color == 'G')
a[2][idx]++;
}
for(int i = 0; i < 3; i++) {
int[] cnt = new int[3];
for(int j = 1; j < 10; j++) {
for(int k = 0; k < 3; k++) {
if(a[k][j] > 0)
cnt[k]++;
else
cnt[k] = 0;
if(cnt[k] == 3) {
set++;
cnt[k] = 0;
for(int l = 0; l < 3; l++) {
a[k][j-l]--;
}
}
}
}
for(int j = 1; j < 10; j++) {
for(int k = 0; k < 3; k++) {
if(a[k][j] > 2) {
set += a[k][j] / 3;
a[k][j] = a[k][j] % 3;
}
}
}
}
if(set == 3)
System.out.println("#" + t + " Win");
else
System.out.println("#" + t + " Continue");
}
}
}
'Problem Solving > SWEA' 카테고리의 다른 글
[SWEA] 7193. 승현이의 수학공부 (0) | 2020.02.29 |
---|---|
[SWEA] 4579. 세상의 모든 팰린드롬 2 (0) | 2020.02.29 |
[SWEA] 6057. 그래프의 삼각형 (0) | 2020.02.28 |
[SWEA] 4615. 재미있는 오셀로 게임 (0) | 2020.02.28 |
[SWEA] 8016. 홀수 피라미드 (0) | 2020.02.28 |
댓글