Study/Problem Solving

[SWEA / Java] 4047번: 영준이의 카드 카운팅 (D3)

Pearlii 2023. 7. 27. 17:01

문제 풀이 날짜: 2023.07.27
포스트 작성일: 2023.07.27

 

* 학습 목적으로 작성하는 글입니다. 풀이가 정석적이지 못할 수도 있습니다.

 

문제 출처

SWEA 4047번: 영준이의 카드 카운팅 (D3)

 

키워드

문자열

 

풀이 접근법

  • 간단한 문자열 처리 문제
  • 크로아티아 알파벳 문제처럼, 문제에서 주어진 문자 4가지를 배열에 담아 참조하는 형식으로 접근했다.
  • 또한 char 타입은 int 아스키코드로 자동 캐스팅된다는 점에서 착안해, 배열의 인덱스로 정수가 아닌 char 타입의 아스키코드를 참조하게 했다.

 

코드

import java.util.*;
import java.io.*;

class Solution
{
	private static final int MAX = 'Z';
	private static final int NUM = 13;
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		int[] types = {'S', 'D', 'H', 'C'};
		StringBuilder sb = new StringBuilder();
		for(int test_case = 1; test_case <= T; test_case++) {
			String input = br.readLine();
			
			boolean[][] cards = new boolean[MAX][NUM + 1];
			
			sb.append("#").append(test_case).append(" ");
			
			boolean isError = false;
			int len = input.length();
			for(int i = 0; i < len; i = i + 3) {
				char type = input.charAt(i);
				int digit1 = input.charAt(i + 1) - '0';
				int digit2 = input.charAt(i + 2) - '0';
				
				int num = digit1 * 10 + digit2;
				
				if(!cards[type][num]) { //아스키코드를 배열 인덱스로
					cards[type][num] = true;
				}
				else {
					isError = true;
					sb.append("ERROR").append("\n");
					break;
				}
			}
			
			if(isError) {
				continue;
			}
			
			for(int type : types) { //4종류 카드의 장수 검사
				int count = NUM;
				for(boolean b : cards[type]) {
					if(b == true) {
						count--;
					}
				}
				sb.append(count).append(" ");
			}
			
			sb.append("\n");
		}
		
		System.out.println(sb);
	}
}

 

git 링크

(git 링크 첨부)