/ BOJ

BOJ_2621_카드게임_JAVA

문제 : 카드게임

링크 : BOJ_2621_카드게임

접근 방식

카드게임이라고 쓰여있지만 사실상 포커의 룰을 적용하는 문제이다. 포커에 익숙하다면 조건을 찾는 것이 더 쉬울 수 있다.

그렇지만 포커를 잘 몰라도 조건에 대한 설명이 잘 쓰여있기 때문에, 문제에 적힌대로 차근차근 조건만 완성해나가면 충분히 풀 수 있는 문제이다.

두 개 이상의 조건을 만족하면 더 큰 점수를 얻기 때문에, 나는 가장 많은 점수를 얻을 수 있는 첫 번째 조건부터 체크를 하여 조건을 만족하는 순간 답을 출력하고 시스템을 종료하게 만들었다.

카운트 배열을 사용하여 숫자의 개수를 세었는데, 범위체크를 잘못하여 3번 틀렸다. 꼼꼼하게 살펴볼 필요가 있었던 것 같다.

소스 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

// 포커임
public class BOJ_2621_카드게임 {

	public static void main(String[] args) throws IOException {

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st;

		int[][] card = new int[5][2];

		int[] cntCard = new int[10];

		int maxNum = 0;

		for (int i = 0; i < 5; i++) {
			st = new StringTokenizer(in.readLine());

			card[i][0] = st.nextToken().charAt(0) - 'A';

			card[i][1] = st.nextToken().charAt(0) - '0';
			maxNum = Math.max(maxNum, card[i][1]);
		}

		// 1. 로티플?
		boolean isroti1 = true;
		boolean isroti2 = false;
		for (int i = 0; i < 5; i++) {
			cntCard[card[i][1]]++;
		}
		for (int i = 1; i < 5; i++) {
			// 색깔이 다른 경우 break;
			if (card[0][0] != card[i][0]) {
				isroti1 = false;
				break;
			}

		}
//		System.out.println(Arrays.toString(cntCard));
		int cnt = 1;
		for (int i = 1; i <= 9; i++) {
			if (cntCard[i] == 1 && cntCard[i - 1] == 1) {
				cnt++;
			}
		}
		if (cnt == 5) {
			isroti2 = true;
		}



		if (isroti1 && isroti2) {
			System.out.println(maxNum + 900);
			System.exit(0);
		}

		// 2. 포카드
		for (int i = 1; i <= 9; i++) {
			if (cntCard[i] >= 4) {
				System.out.println(i + 800);
				System.exit(0);
			}
		}

		// 3. 풀하우스
		int house1 = 0;
		int house2 = 0;
		for (int i = 1; i <= 9; i++) {
			if (cntCard[i] == 3) {
				house1 = i;
			}
			if (cntCard[i] == 2) {
				house2 = i;
			}
		}
		if (house1 != 0 && house2 != 0) {
			System.out.println(house1*10 + 700+house2);
			System.exit(0);
		}

		// 4. 플러시
		if(isroti1) {
			System.out.println(maxNum + 600);
			System.exit(0);
		}

		// 5. 스트레이트
		if(isroti2) {
			System.out.println(maxNum + 500);
			System.exit(0);
		}

		// 6. 트리플
		if(house1 != 0) {
			System.out.println(house1 + 400);
			System.exit(0);
		}
		// 7. 투 페어
		int one = 0;
		int two = 0;
		for(int i=1;i<=9;i++) {
			if(cntCard[i] == 2 && one == 0) {
				one = i;
			}else if(cntCard[i] == 2){
				two = i;
			}
		}
		if(one != 0 && two != 0) {
			System.out.println(two*10 + 300 + one);
			System.exit(0);
		}

		// 8. 원 페어
		if(one != 0) {
			System.out.println(200 + one);
			System.exit(0);
		}

		// 9. top
		System.out.println(maxNum+ 100);

	}

}