CodingTest/UVa

[Java] 포커 패 Poker Hands

슬라임 통통 2020. 9. 11. 00:31
728x90

[Java] 포커 패 Poker Hands

문제 설명

내 코드

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





class Main {
	
	static LinkedHashMap<Integer,Integer> number(int []card){

		LinkedHashMap<Integer,Integer> map = new LinkedHashMap<Integer,Integer>();

		//card는 이미 내림차순으로 정렬된 상태로 들어옴 그걸 해쉬맵 < 넘버 , 갯수> 로 넣기
		int num=0,count=1;
		for(int i=0; i<card.length; i++){
			if(!map.containsKey(card[i])){
				map.put(card[i],1);
			}
			else{
				int value = map.get(card[i]);
				map.put(card[i], ++value);
			}
		}
		
		
		// Key순이 아닌 value 순으로 정렬하기
		if(map.size()<5){
			Object []val = map.values().toArray();
			Arrays.sort(val);
			LinkedHashMap<Integer, Integer> map1 = new LinkedHashMap<Integer,Integer>();
			for(int i=0; i<val.length;i++){
				for(Integer key: map.keySet()){
					if(map.get(key)==(int)val[val.length-1-i]){
						map1.put(key, (Integer)val[val.length-1-i]);
						map.remove(key);
						break;
					}
				}
			}
			
			return map1;
		}

		return map;
	}
	
	//스트레이트인지 아닌지 검사
	static boolean isstraight(Object[] key){
		boolean result=true;
		for(int i =0 ; i<key.length-1; i++)
			if(((int)key[i]- (int)key[i+1])!=1)
				result = false;
		return result;
	}
	
	//배열 뒤집기
	static int[] reverse(int[] arr){
		int[] newarr= new int[arr.length];
		for(int i= 0; i<arr.length;i++ )
			newarr[i] = arr[arr.length-1-i];
		
		return newarr;
	}
	

	//다섯장의 카드 등급이 무엇인지 리턴한다.
	static int result(char[] card, Map<Integer,Integer> map){
		Object [] key = map.keySet().toArray();
		Object [] value = map.values().toArray();
		
		
		//flush인지 아닌지 우선조사
		char same= card[0];
		boolean flush= true;
		for(int i=0; i<card.length; i++){
			if(same != card[i]){
				flush = false;
				break;
			}
		}
		
	
		//카드 등급매기기
		if(flush && isstraight(key)){

			return 8;
		}
		else if((int)value[0]== 4){
			//System.out.println(" fffff");
			return 7;
		}
		else if( (int)value[0]==3 && map.size()==2){

			return 6;
		}
		else if( flush ){

			return 5;			
		}
		else if(!flush && isstraight(key) && map.size()==5){
			return 4;
		}
		else if(!flush && (int)value[0]==3 && map.size()>2){
			return 3;
		}
		else if(!flush && (int)value[0]==2 && (int)value[1]==2){
			return 2;
		}
		else if(!flush && (int)value[0]==2 && map.size()==4){
			return 1;
		}
		else 
			return 0;

	}

	//알파벳은 숫자로 변경
	static int tonumber(char a){
		if(a == 'T')
			return 10;
		else if(a == 'J')
			return 11;
		else if(a == 'Q')
			return 12;
		else if(a == 'K')
			return 13;
		else if(a == 'A')
			return 14;
		else
			return Integer.parseInt(String.valueOf(a));
	}
	
	public static void main(String[] args) throws Exception {
		
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()){
			
			int black_number[]= new int[5];
			char black_color[] = new char[5];
			int white_number[]= new int[5];
			char white_color[] = new char[5];


			for(int i=0; i<5; i++){
				String card = scanner.next();
				char tmp = card.charAt(0);
				black_number[i] = tonumber(tmp);
				black_color[i] = card.charAt(1);
			}

			for(int i=0; i<5; i++){
				String card = scanner.next();
				char tmp = card.charAt(0);
				white_number[i] = tonumber(tmp);
				white_color[i] = card.charAt(1);
			}

			Arrays.sort(black_number);
			black_number = reverse(black_number);
			Arrays.sort(white_number);
			white_number = reverse(white_number);

			LinkedHashMap<Integer,Integer> black_map = number(black_number);
			LinkedHashMap<Integer,Integer> white_map = number(white_number);

			
			//카드 등급 저장
			int result1 = result(black_color, black_map);
			int result2 = result(white_color, white_map);
			
			
			//등급으로 누가 이겼는지 판별 같을 경우 카드의 숫자 대로 판별
			if(result1>result2){
				System.out.println("Black wins.");
			}
			else if(result1<result2){
				System.out.println("White wins.");
			}
			else{   //같을 경우 카드의 숫자를 포커 룰을 기반으로 비교
				Object[] key_b = black_map.keySet().toArray();
				Object[] key_w = white_map.keySet().toArray();

				int symbol=0;
				
				for(int i =0 ; i<key_b.length; i++){
					if((int)key_b[i]>(int)key_w[i]){
						System.out.println("Black wins."); 
						symbol=1;
						break;
					}
					else if((int)key_b[i]<(int)key_w[i]){
						System.out.println("White wins.");
						symbol=1;
						break;
					}
				}
				
				if(symbol==0)
					System.out.println("Tie.");
			}
		}


		
		
		
	}
}

 

 

🔑 Key Point 🔑

드럽게 복잡하고 룰이 많다

깨달은 점은 Java는 역순 정렬 하는것이 매우 불편하며, Hash_map의 key ,value를 역순 정렬하는것은 더욱 불편하다 

특히 Hash_map의 value의 역순 정렬은 죽을맛이다...

 

어쨋든 기본 타입형을 역순 정렬 하려면 기본형이 아닌 객체형 ex ) int 가 아닌 Integer 형의 배열에 미리부터 넣어둔뒤
Arrays.sort(배열이름 ,Collections.reverse()); 해주면 된다. 

728x90
반응형