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
반응형
'💡 CodingTest > UVa' 카테고리의 다른 글
[Java] 쌓아 올리기 Stack'em up (0) | 2020.09.18 |
---|---|
[Java] 동맹 휴업 Hartals (0) | 2020.09.11 |
[Java] 유쾌한 점퍼 Jolly Jumper (0) | 2020.09.09 |
[Java] 3n+1 문제 : The Collatz problem (0) | 2020.09.07 |
[Java] 10진수 대 16진수 (0) | 2020.09.07 |