포커용 카드는 52개의 카드로 이루어집니다.
각 카드는 클럽, 다이아몬드, 하트, 스페이드의 무늬을 가집니다.
이 모양은 C, D, H, S 로 표기합니다.
또한 각 카드는 2에서 10까지, 그리고 잭, 퀸, 킹 또는 에이스의 값을 갖습니다.
이 값은 2, 3, 4, 5, 6, 7, 8, 9, T, J, Q, K, A 로 표기합니다.
점수를 매길 때 위에 열거한 순서대로 등급이 매겨지며 2가 가장 낮고 에이스가 가장 높습니다.
무늬는 값에 영향을 끼치지 않습니다.
포커 패는 다섯 장의 카드로 구성되며 다음과 같은 순서대로 등급이 매겨집니다.
하이카드 : 아래에 있는 것 가운데 어떤 범주에도 속하지 않는 패. 가장 높은 카드의 값에 따라 등급이 매겨집니다. 가장 높은 카드의 값이 같으면 그 다음 카드, 그 다음 카드도 같으면 그 다음 카드, 이런 식으로 등급이 매겨집니다.
원 페어 : 다섯 장의 카드 가운데 두 장이 같은 경우. 같은 원 페어끼리 맞붙는 경우에는 그 중 더 높은 페어의 값에 의해 더 높은 등급이 매겨집니다. 두 쌍의 값이 모두 같으면 남은 카드에 의해 더 높은 패가 결정됩니다.
쓰리 카드 : 다섯 장 가운데 세 장이 같은 값을 가지는 경우. 스트레이트끼리 맞붙을 경우에는 가장 높은 카드에 의해 더 높은 패가 결정됩니다.
스트레이트 : 다섯 장의 카드가 연속적인 값을 가지는 경우. 스트레이트끼리 맞붙을 경우에는 가장 높은 카드에 의해 더 높은 패가 결정됩니다.
플러시 : 다섯 장의 카드의 무늬가 모두 같은 경우. 플러시끼리 맞붙을 경우에는 하이 카드의 규칙에 따라서 더 높은 패가 결정됩니다.
풀 하우스 : 세 장의 카드가 같은 값을 가지고 나머지 두 장의 카드가 같은 값을 가지는 경우. 같은 값을 가지는 세장의 카드의 우열에 의해 더 높은 패가 결정됩니다.
포 카드 : 네 장의 카드가 같은 값을 가지는 경우. 포 카드끼리 맞붙는 경우에는 네 장의 같은 값을 가지는 카드의 값에 의해 더 높은 패가 결정됩니다.
스트레이트 플러시 : 다섯 장의 카드가 무늬가 같으면서 모두 연속적인 값을 가지는 경우. 패에 있는 것 중 가장 높은 카드에 의해서 더 높은 패가 결정됩니다.
포커패를 비교해서 어느 쪽이 이겼는지 아니면 무승부인지를 알아내는 프로그램을 만들어 봅시다.
입력
입력은 한 줄을 입력 받습니다. 이 줄에는 열 장의 카드를 나타내는 값이 들어가 있습니다.
앞에 있는 다섯 장의 카드는 "Black" 참가자의 카드고, 뒤의 카드는 "White" 참가자의 카드입니다.
출력
입력된 각 줄에 대해 다음 중 한가지가 들어있는 행을 출력합니다.
Black wins.
White wins.
Tie
예제
※ 중간에 디버깅을 위해, 각 참가자의 카드를 출력하고 패의 종류를 표기하는 것을 추가했습니다.
해설
포커에 경험이 있어야 이해가 쉬울 수 있습니다. 포커에 대한 내용은 다른 사이트를 참조해보시면 좋을 것 같습니다.
처리하면서 골치아픈 중의 하나가 에이스 (A) 의 처리입니다. 에이스 (A)는 1일 수도 있고, 14를 의미할 수도 있기 때문입니다. 그리고 같은 등급의 패일 경우, 각 카드를 검색해서 더 높은 패를 가려야 하는 부분이 은근히 귀찮습니다.
# Quiz 0010, Poker Hands
# written by badsaram
import sys
import re
from enum import IntEnum
class Color(IntEnum):
BLACK = 0
RED = 1
class Mark(IntEnum):
SPADE = 0
HEART = 1
DIAMOND = 2
CLOVER = 3
class Hand(IntEnum):
HIGHCARD = 0
ONEPAIR = 1
TWOPAIR = 2
THREECARD = 3
STRAIGHT = 4
FLUSH = 5
FULLHOUSE = 6
FOURCARD = 7
STFLUSH = 8
RSTFLUSH = 9
class PokerCard(object):
def __init__(self, strCard):
self.convertCard(strCard)
def getMark(self):
return self.mark
def getColor(self):
return self.color
def getNumber(self):
return self.number
def getPrint(self):
print_num = ('A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K')
print_mark = ('S', 'H', 'D', 'C')
ret = "{num}{mark}".format(num = print_num[self.number - 1], mark = print_mark[self.mark])
return ret
def convertCard(self, strCard):
tempStr = strCard.upper()
if (re.match("[2-9]+", tempStr[0]) != None):
self.number = int(tempStr[0])
elif (tempStr[0] == 'T'):
self.number = 10
elif (tempStr[0] == 'J'):
self.number = 11
elif (tempStr[0] == 'Q'):
self.number = 12
elif (tempStr[0] == 'K'):
self.number = 13
elif (tempStr[0] == 'A'):
self.number = 1
else:
pass
if (tempStr[1]) == 'S':
self.mark = Mark.SPADE
self.color = Color.BLACK
elif (tempStr[1]) == 'H':
self.mark = Mark.HEART
self.color = Color.RED
elif (tempStr[1]) == 'D':
self.mark = Mark.DIAMOND
self.color = Color.RED
else:
self.mark = Mark.CLOVER
self.color = Color.BLACK
class PokerHands(object):
def __init__(self):
self.card1 = []
self.card2 = []
def input(self):
str = input()
# The order of black and white are changed
str_cards = str.split(' ')
if (len(str_cards) == 10):
self.card2.append(PokerCard(str_cards[0]))
self.card2.append(PokerCard(str_cards[1]))
self.card2.append(PokerCard(str_cards[2]))
self.card2.append(PokerCard(str_cards[3]))
self.card2.append(PokerCard(str_cards[4]))
self.card1.append(PokerCard(str_cards[5]))
self.card1.append(PokerCard(str_cards[6]))
self.card1.append(PokerCard(str_cards[7]))
self.card1.append(PokerCard(str_cards[8]))
self.card1.append(PokerCard(str_cards[9]))
else:
pass
def run(self):
if ((len(self.card1) != 5) or (len(self.card2) != 5)):
print("Error")
return
white_rank = self.checkHandRanking(self.card1)
black_rank = self.checkHandRanking(self.card2)
self.printHands(self.card1, "White", white_rank)
self.printHands(self.card2, "Black", black_rank)
if (white_rank > black_rank):
print("White wins.")
elif (white_rank < black_rank):
print("Black wins.")
else:
if (white_rank == Hand.RSTFLUSH):
ret = 0
elif (white_rank == Hand.STFLUSH):
ret = self.checkTieForStFlush(self.card1, self.card2)
elif (white_rank == Hand.FOURCARD):
ret = self.checkTieForFourCard(self.card1, self.card2)
elif (white_rank == Hand.FULLHOUSE):
ret = self.checkTieForFullHouse(self.card1, self.card2)
elif (white_rank == Hand.FLUSH):
ret = self.checkTieForFlush(self.card1, self.card2)
elif (white_rank == Hand.STRAIGHT):
ret = self.checkTieForStraight(self.card1, self.card2)
elif (white_rank == Hand.THREECARD):
ret = self.checkTieForThreeCard(self.card1, self.card2)
elif (white_rank == Hand.TWOPAIR):
ret = self.checkTieForTwoPair(self.card1, self.card2)
elif (white_rank == Hand.ONEPAIR):
ret = self.checkTieForOnePair(self.card1, self.card2)
else:
ret = self.checkTieForHighCard(self.card1, self.card2)
if (ret > 0):
print("White wins")
elif (ret < 0):
print("Black wins")
else:
print("Tie.")
def getRankPrint(self, rank):
print_rank = ("High Card", "One Pair", "Two Pair", "Three Card", "Straight", "Flush", "Full House", \
"Four Card", "Straight Flush", "Royal Straight Flush")
return print_rank[rank]
def printHands(self, hands, prompt, rank):
print("%s : %s %s %s %s %s -> %s" % (prompt, hands[0].getPrint(), hands[1].getPrint(), hands[2].getPrint(), \
hands[3].getPrint(), hands[4].getPrint(), self.getRankPrint(rank)))
def getNumArray(self, hands):
ret = []
for hand in hands:
ret.append(hand.getNumber())
return ret
def checkHandRanking(self, hands):
rank = Hand.HIGHCARD
if (self.isRstFlush(hands) == True):
rank = Hand.RSTFLUSH
elif (self.isStFlush(hands) == True):
rank = Hand.STFLUSH
elif (self.isFourCard(hands) == True):
rank = Hand.FOURCARD
elif (self.isFullHouse(hands) == True):
rank = Hand.FULLHOUSE
elif (self.isFlush(hands) == True):
rank = Hand.FLUSH
elif (self.isStraight(hands) == True):
rank = Hand.STRAIGHT
elif (self.isThreeCard(hands) == True):
rank = Hand.THREECARD
elif (self.isTwoPair(hands) == True):
rank = Hand.TWOPAIR
elif (self.isOnePair(hands) == True):
rank = Hand.ONEPAIR
else:
rank = Hand.HIGHCARD
return rank
def isRstFlush(self, hands):
ret = False
if (self.isStFlush(hands) == True):
num_array = self.getNumArray(hands)
num_array.sort()
if ((num_array[0] == 1) and (num_array[1] == 10)):
ret = True
return ret
def isStFlush(self, hands):
ret = False
if ((self.isFlush(hands) == True) and (self.isStraight(hands) == True)):
ret = True
return ret
def isFourCard(self, hands):
ret = False
check_array = [ 0 for i in range(13) ]
for hand in hands:
check_array[hand.getNumber() - 1] += 1
if ((4 in check_array) == True):
ret = True
return ret
def isFullHouse(self, hands):
ret = False
check_array = [ 0 for i in range(13) ]
for hand in hands:
check_array[hand.getNumber() - 1] += 1
if ((check_array.count(3) == 1) and (check_array.count(2) == 1)):
ret = True
return ret
def isFlush(self, hands):
ret = True
check_mark = hands[0].getMark()
for hand in hands:
if (hand.getMark() != check_mark):
ret = False
return ret
def isStraight(self, hands):
ret = False
check_array = [ 0 for i in range(13) ]
for hand in hands:
check_array[hand.getNumber() - 1] += 1
if (check_array.count(1) != 5):
ret = False
else:
num_array = self.getNumArray(hands)
num_array.sort()
if ((num_array[4] - num_array[0]) == 4):
ret = True
elif ((num_array[0] == 1) and (num_array[1] == 10)):
ret = True
else:
pass
return ret
def isThreeCard(self, hands):
ret = False
check_array = [ 0 for i in range(13) ]
for hand in hands:
check_array[hand.getNumber() - 1] += 1
if ((3 in check_array) == True) and (2 not in check_array):
ret = True
return ret
def isTwoPair(self, hands):
ret = False
check_array = [ 0 for i in range(13) ]
for hand in hands:
check_array[hand.getNumber() - 1] += 1
if (check_array.count(2) == 2):
ret = True
return ret
def isOnePair(self, hands):
ret = False
check_array = [ 0 for i in range(13) ]
for hand in hands:
check_array[hand.getNumber() - 1] += 1
if ((check_array.count(2) == 1) and (3 not in check_array)):
ret = True
return ret
def checkTieForRstFlush(self, hands1, hands2):
ret = 0
return ret
def checkTieForStFlush(self, hands1, hands2):
ret = self.checkTieForHighCard()
return ret
def checkTieForFourCard(self, hands1, hands2):
ret = 0
paircard1 = 0
paircard2 = 0
check_array1 = [ 0 for i in range(13) ]
for hand1 in hands1:
check_array1[hand1.getNumber() - 1] += 1
if (check_array1[hand1.getNumber() - 1] >= 4):
paircard1 = hand1.getNumber()
check_array2 = [ 0 for i in range(13) ]
for hand2 in hands2:
check_array2[hand2.getNumber() - 1] += 1
if (check_array2[hand2.getNumber() - 1] >= 4):
paircard2 = hand2.getNumber()
if (paircard1 != paircard2):
if (paircard1 == 1):
paircard1 = 14
if (paircard2 == 1):
paircard2 = 14
if (paircard1 > paircard2):
ret = 1
else:
ret = -1
else:
num_array1 = self.getNumArray(hands1)
num_array2 = self.getNumArray(hands2)
num_array1.sort()
num_array2.sort()
if ((1 in num_array1) and (1 not in num_array2)):
ret = 1
elif ((1 not in num_array1) and (1 in num_array2)):
ret = -1
else:
for i in range(4, 0, -1):
if (num_array1[i] > num_array2[i]):
ret = 1
break
elif (num_array1[i] < num_array2[i]):
ret = -1
break
return ret
def checkTieForFullHouse(self, hands1, hands2):
ret = 0
paircard1_3 = 0
paircard1_2 = 0
paircard2_3 = 0
paircard2_1 = 0
check_array1 = [ 0 for i in range(13) ]
for hand1 in hands1:
check_array1[hand1.getNumber() - 1] += 1
check_array2 = [ 0 for i in range(13) ]
for hand2 in hands2:
check_array2[hand2.getNumber() - 1] += 1
for i in range(13):
if (check_array1[i] >= 3):
if (i == 1):
paircard1_3 = 14
else:
paircard1_3 = i
elif (check_array1[i] >= 2):
if (i == 1):
paircard1_2 = 14
else:
paircard1_2 = i
else:
pass
if (check_array2[i] >= 3):
if (i == 1):
paircard2_3 = 14
else:
paircard2_3 = i
elif (check_array2[i] >= 2):
if (i == 1):
paircard2_2 = 14
else:
paircard2_2 = i
else:
pass
if (paircard1_3 > paircard2_3):
ret = -1
elif (paircard1_3 < paircard2_3):
ret = 1
else:
if (paircard1_2 > paircard2_2):
ret = -1
elif (paircard1_2 < paircard2_2):
ret = 1
else:
ret = 0
return ret
def checkTieForFlush(self, hands1, hands2):
ret = self.checkTieForHighCard(hands1, hands2)
return ret
def checkTieForStraight(self, hands1, hands2):
ret = self.checkTieForHighCard(hands1, hands2)
return ret
def checkTieForThreeCard(self, hands1, hands2):
ret = 0
paircard1 = 0
paircard2 = 0
check_array1 = [ 0 for i in range(13) ]
for hand1 in hands1:
check_array1[hand1.getNumber() - 1] += 1
if (check_array1[hand1.getNumber() - 1] >= 3):
paircard1 = hand1.getNumber()
check_array2 = [ 0 for i in range(13) ]
for hand2 in hands2:
check_array2[hand2.getNumber() - 1] += 1
if (check_array2[hand2.getNumber() - 1] >= 3):
paircard2 = hand2.getNumber()
if (paircard1 != paircard2):
if (paircard1 == 1):
paircard1 = 14
if (paircard2 == 1):
paircard2 = 14
if (paircard1 > paircard2):
ret = 1
else:
ret = -1
else:
num_array1 = self.getNumArray(hands1)
num_array2 = self.getNumArray(hands2)
num_array1.sort()
num_array2.sort()
if ((1 in num_array1) and (1 not in num_array2)):
ret = 1
elif ((1 not in num_array1) and (1 in num_array2)):
ret = -1
else:
for i in range(4, 0, -1):
if (num_array1[i] > num_array2[i]):
ret = 1
break
elif (num_array1[i] < num_array2[i]):
ret = -1
break
return ret
def checkTieForTwoPair(self, hands1, hands2):
ret = 0
paircard1 = []
paircard2 = []
check_array1 = [ 0 for i in range(13) ]
for hand1 in hands1:
check_array1[hand1.getNumber() - 1] += 1
if (check_array1[hand1.getNumber() - 1] >= 2):
paircard1.append(hand1.getNumber())
check_array2 = [ 0 for i in range(13) ]
for hand2 in hands2:
check_array2[hand2.getNumber() - 1] += 1
if (check_array2[hand2.getNumber() - 1] >= 2):
paircard2.append(hand2.getNumber())
if ((1 in paircard1) and (1 not in paircard2)):
ret = 1
elif ((1 not in paircard1) and (1 in paircard2)):
ret = -1
else:
num_array1 = self.getNumArray(hands1)
num_array2 = self.getNumArray(hands2)
num_array1.sort()
num_array2.sort()
if ((1 in num_array1) and (1 not in num_array2)):
ret = 1
elif ((1 not in num_array1) and (1 in num_array2)):
ret = -1
else:
for i in range(4, 0, -1):
if (num_array1[i] > num_array2[i]):
ret = 1
break
elif (num_array1[i] < num_array2[i]):
ret = -1
break
return ret
def checkTieForOnePair(self, hands1, hands2):
ret = 0
paircard1 = 0
paircard2 = 0
check_array1 = [ 0 for i in range(13) ]
for hand1 in hands1:
check_array1[hand1.getNumber() - 1] += 1
if (check_array1[hand1.getNumber() - 1] >= 2):
paircard1 = hand1.getNumber()
check_array2 = [ 0 for i in range(13) ]
for hand2 in hands2:
check_array2[hand2.getNumber() - 1] += 1
if (check_array2[hand2.getNumber() - 1] >= 2):
paircard2 = hand2.getNumber()
if (paircard1 != paircard2):
if (paircard1 == 1):
paircard1 = 14
if (paircard2 == 1):
paircard2 = 14
if (paircard1 > paircard2):
ret = 1
else:
ret = -1
else:
num_array1 = self.getNumArray(hands1)
num_array2 = self.getNumArray(hands2)
num_array1.sort()
num_array2.sort()
if ((1 in num_array1) and (1 not in num_array2)):
ret = 1
elif ((1 not in num_array1) and (1 in num_array2)):
ret = -1
else:
for i in range(4, 0, -1):
if (num_array1[i] > num_array2[i]):
ret = 1
break
elif (num_array1[i] < num_array2[i]):
ret = -1
break
return ret
def checkTieForHighCard(self, hands1, hands2):
ret = 0
num_array1 = self.getNumArray(hands1)
num_array2 = self.getNumArray(hands2)
num_array1.sort()
num_array2.sort()
if ((1 in num_array1) and (1 not in num_array2)):
ret = 1
elif ((1 not in num_array1) and (1 in num_array2)):
ret = -1
else:
for i in range(4, 0, -1):
if (num_array1[i] > num_array2[i]):
ret = 1
break
elif (num_array1[i] < num_array2[i]):
ret = -1
break
return ret
def makePattern1(self):
self.card1.append(PokerCard("AS"))
self.card1.append(PokerCard("2S"))
self.card1.append(PokerCard("3S"))
self.card1.append(PokerCard("4S"))
self.card1.append(PokerCard("5S"))
self.card2.append(PokerCard("AD"))
self.card2.append(PokerCard("2C"))
self.card2.append(PokerCard("3D"))
self.card2.append(PokerCard("4C"))
self.card2.append(PokerCard("5H"))
def makePattern2(self):
self.card1.append(PokerCard("AS"))
self.card1.append(PokerCard("KS"))
self.card1.append(PokerCard("TS"))
self.card1.append(PokerCard("QS"))
self.card1.append(PokerCard("JS"))
self.card2.append(PokerCard("AD"))
self.card2.append(PokerCard("2C"))
self.card2.append(PokerCard("3D"))
self.card2.append(PokerCard("4C"))
self.card2.append(PokerCard("5H"))
def makePattern3(self):
self.card1.append(PokerCard("AC"))
self.card1.append(PokerCard("2S"))
self.card1.append(PokerCard("3S"))
self.card1.append(PokerCard("4S"))
self.card1.append(PokerCard("5S"))
self.card2.append(PokerCard("AD"))
self.card2.append(PokerCard("2C"))
self.card2.append(PokerCard("3D"))
self.card2.append(PokerCard("4C"))
self.card2.append(PokerCard("5H"))
def makePatternTieHighcard(self):
self.card1.append(PokerCard("AC"))
self.card1.append(PokerCard("3S"))
self.card1.append(PokerCard("5S"))
self.card1.append(PokerCard("7S"))
self.card1.append(PokerCard("9S"))
self.card2.append(PokerCard("2D"))
self.card2.append(PokerCard("4C"))
self.card2.append(PokerCard("6D"))
self.card2.append(PokerCard("8C"))
self.card2.append(PokerCard("9H"))
def makePatternTieOnePair(self):
self.card1.append(PokerCard("2C"))
self.card1.append(PokerCard("3S"))
self.card1.append(PokerCard("5S"))
self.card1.append(PokerCard("AD"))
self.card1.append(PokerCard("AS"))
self.card2.append(PokerCard("2D"))
self.card2.append(PokerCard("4C"))
self.card2.append(PokerCard("6D"))
self.card2.append(PokerCard("9C"))
self.card2.append(PokerCard("9H"))
def makePatternTieTwoPair(self):
self.card1.append(PokerCard("AC"))
self.card1.append(PokerCard("3S"))
self.card1.append(PokerCard("3H"))
self.card1.append(PokerCard("6D"))
self.card1.append(PokerCard("6S"))
self.card2.append(PokerCard("2D"))
self.card2.append(PokerCard("3C"))
self.card2.append(PokerCard("3D"))
self.card2.append(PokerCard("AD"))
self.card2.append(PokerCard("AH"))
def makePatternTieThreeCard(self):
self.card1.append(PokerCard("AC"))
self.card1.append(PokerCard("3S"))
self.card1.append(PokerCard("6H"))
self.card1.append(PokerCard("6D"))
self.card1.append(PokerCard("6S"))
self.card2.append(PokerCard("2D"))
self.card2.append(PokerCard("3C"))
self.card2.append(PokerCard("AS"))
self.card2.append(PokerCard("AD"))
self.card2.append(PokerCard("AH"))
def makePatternTieStraight(self):
self.card1.append(PokerCard("AC"))
self.card1.append(PokerCard("2S"))
self.card1.append(PokerCard("3H"))
self.card1.append(PokerCard("4D"))
self.card1.append(PokerCard("5S"))
self.card2.append(PokerCard("9D"))
self.card2.append(PokerCard("KC"))
self.card2.append(PokerCard("QS"))
self.card2.append(PokerCard("JD"))
self.card2.append(PokerCard("TH"))
def makePatternTieFlush(self):
self.card1.append(PokerCard("AC"))
self.card1.append(PokerCard("2C"))
self.card1.append(PokerCard("3C"))
self.card1.append(PokerCard("4C"))
self.card1.append(PokerCard("6C"))
self.card2.append(PokerCard("AD"))
self.card2.append(PokerCard("KD"))
self.card2.append(PokerCard("QD"))
self.card2.append(PokerCard("JD"))
self.card2.append(PokerCard("9D"))
def makePatternTieFullHouse(self):
self.card1.append(PokerCard("AC"))
self.card1.append(PokerCard("AH"))
self.card1.append(PokerCard("AS"))
self.card1.append(PokerCard("3D"))
self.card1.append(PokerCard("3C"))
self.card2.append(PokerCard("KD"))
self.card2.append(PokerCard("KS"))
self.card2.append(PokerCard("KH"))
self.card2.append(PokerCard("QC"))
self.card2.append(PokerCard("QD"))
def makePatternTieFourCard(self):
self.card1.append(PokerCard("AC"))
self.card1.append(PokerCard("AH"))
self.card1.append(PokerCard("AS"))
self.card1.append(PokerCard("AD"))
self.card1.append(PokerCard("6C"))
self.card2.append(PokerCard("KD"))
self.card2.append(PokerCard("KS"))
self.card2.append(PokerCard("KH"))
self.card2.append(PokerCard("KC"))
self.card2.append(PokerCard("9D"))
if __name__ == '__main__':
obj = PokerHands()
obj.input()
#obj.makePattern1()
#obj.makePattern2()
#obj.makePattern3()
#obj.makePatternTieHighcard()
#obj.makePatternTieOnePair()
#obj.makePatternTieTwoPair()
#obj.makePatternTieThreeCard()
#obj.makePatternTieStraight()
#obj.makePatternTieFlush()
#obj.makePatternTieFullHouse()
#obj.makePatternTieFourCard()
obj.run()
'코딩 테스트' 카테고리의 다른 글
문제 12 : 암호 깨기 (Crypt Kicker) (0) | 2022.12.11 |
---|---|
문제 11 : 동맹 휴업 (Hartal) (0) | 2022.08.26 |
문제 9 : 유쾌한 점프 (Jolly Jumpers) (0) | 2022.08.05 |
문제 8 : 호주식 투표법 (0) | 2022.08.01 |
문제 7 : 체크 확인 (Check the Check) (0) | 2022.07.29 |