본문 바로가기
코딩/백준-자바

[자바] 백준 2621번: 카드게임

by 철없는민물장어 2023. 1. 17.
728x90
반응형

https://www.acmicpc.net/problem/2621

 

2621번: 카드게임

근우는 오늘 재미있는 카드 게임을 배우고 있다. 카드는 빨간색, 파란색, 노란색, 녹색의 네 가지 색이 있고, 색깔별로 1부터 9까지 숫자가 쓰여진 카드가 9장씩 있다. 카드는 모두 36(=4x9)장이다.

www.acmicpc.net

문제가 정말..너무 길다.

 

문제 자체는 어려운 게 없었는데, 규칙이 너무 많아서 내가 코드를 짠게 아니라 노동을 한 것 같다.

 

나는 문제에서 정해준 규칙 1번~9번을 그대로 if-else문으로 만들었는데

다른 방법으로 코드를 짰으면 더 간결했을까?

 

.

.

우선 카드 정보를 입력받는데,

카드의 숫자는 num[10] 배열에, 카드의 색깔은 RGBY[4] 배열에

숫자와 색깔의 개수만 세서 넣었다.

 

그리고 조건에 부합하는지 확인하기 위해

여러 함수를 만들었는데

sameNumber(int i) => 똑같은 번호인 카드를 i개 가지고 있는지 확인해서 맞으면 true, 아니면 false 리턴

db_sameNumber() ==> 똑같은 번호인 카드를 2개 가지고 있는것이 2쌍 있으면 true, 아니면 false 리턴(ex 1,1,5,5,6이면 true)

sameColor() ==> 같은색깔 카드가 5개면 true, 아니면 false 리턴

consecutive() ==> 가진 카드 중에서 연속적인 숫자의 길이 리턴

 

 

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

public class P2621 {

	static int[] num = new int[10];
	static int[] RGBY = new int[4];

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

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		for (int i = 0; i < 5; i++) {
			st = new StringTokenizer(br.readLine());
			String color = st.nextToken();

			if (color.equals("R")) {
				RGBY[0]++;
			} else if (color.equals("G")) {
				RGBY[1]++;
			} else if (color.equals("B")) {
				RGBY[2]++;
			} else if (color.equals("Y")) {
				RGBY[3]++;
			}
			int n = Integer.parseInt(st.nextToken());
			num[n]++;

		}

		if (sameColor() && consecutive() == 5) {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] > 0) {
					rs = i;
				}
			}

			System.out.println(rs + 900);
		} else if (sameNumber(4)) {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] == 4) {
					rs = i;
				}
			}
			System.out.println(rs + 800);

		} else if (sameNumber(3) && sameNumber(2)) {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] == 3) {
					rs += (i * 10);
				} else if (num[i] == 2) {
					rs += i;
				}
			}
			System.out.println(rs + 700);
		} else if (sameColor()) {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] > 0) {
					rs = i;
				}
			}

			System.out.println(rs + 600);
		} else if (consecutive() == 5) {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] > 0) {
					rs = i;
				}
			}

			System.out.println(rs + 500);
		} else if (sameNumber(3)) {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] == 3) {
					rs += (i);
				}
			}
			System.out.println(rs + 400);
		} else if (db_sameNumber()) {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] == 2) {
					rs += (i);
					break;
				}
			}
			for (int i = 9; i >= 1; i--) {
				if (num[i] == 2) {
					rs += (i * 10);
					break;
				}
			}
			System.out.println(rs + 300);
		} else if (sameNumber(2)) {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] == 2) {
					rs += (i);
				}
			}
			System.out.println(rs + 200);
		} else {
			int rs = 0;
			for (int i = 1; i < 10; i++) {
				if (num[i] > 0) {
					rs = i;
				}
			}

			System.out.println(rs + 100);
		}

	}

	static boolean sameColor() {
		for (int i = 0; i < 4; i++) {
			if (RGBY[i] == 5) {
				return true;
			}
		}
		return false;
	}

	static boolean sameNumber(int n) {
		for (int i = 0; i < 10; i++) {
			if (num[i] == n) {
				return true;
			}
		}
		return false;
	}

	static boolean db_sameNumber() {
		int count = 0;
		for (int i = 0; i < 10; i++) {
			if (num[i] == 2)
				count++;
		}
		if (count == 2)
			return true;
		else
			return false;
	}

	static int consecutive() {

		int consecutive_num = 0;
		for (int i = 0; i < 10; i++) {

			if (num[i] > 0) {
				int count = 1;
				int next = i + 1;
				while (next < 10 && num[next] > 0) {
					next++;
					count++;
				}
				consecutive_num = Math.max(consecutive_num, count);
			}
		}

		return consecutive_num;
	}

}
728x90
반응형

댓글