본문 바로가기
Problem Solving/SWEA

[SWEA] 6781. 삼삼 트리플 게임

by 테리는당근을좋아해 2020. 2. 28.

문제

삼삼 트리플(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");
		}
	}
}

댓글