빅 시티(Big)에는 카지노가 여러 개 있다. 그 중 한 카지노에는 딜러가 속임수를 씁니다. 그녀는 몇 가지 카드 섞는 법을 완벽하게 익혔는데, 그 카드 섞는 법을 사용하면 언제든지 카드를 마음대로 재배치할 수 있습니다. 간단한 예로 '밑장' 섞기를 들 수 있는데, 맨 아래 있는 카드를 꺼내서 맨 위로 올려놓는 방법이다. 그 딜러는 이런 다양한 섞기 방법을 조합해서 원하는 순서대로 카드를 쌓아 올릴 수 있습니다.
카지노의 보안 관리자가 그 딜러를 감시하기 위해 당신을 고용했습니다. 딜러가 섞은 모든 카드 순서가 주어지며 사용된 섞기 방법도 제공됩니다. 이런 정보가 주어졌을 때 몇번의 섞기 작업이 진행된 후의 카드 순서를 예측해야 합니다.
카드 한 벌은 52개의 카드로 구성되며 네 개의 무늬마다 13장의 카드가 있습니다. 카드의 값(숫자)은 2, 3, 4, 5, 6, 7, 8, 9, 10, Jack, Queen, King, Ace 중 하나입니다. 그리고 무늬는 Clubs, Diamonds, Hearts, Spades 가운데 하나입니다. 각 카드는 <값> of <무늬>와 같은 식으로 값과 무늬를 써서 유일하게 식별할 수 있습니다. 예를 들면 "9 of Hearts", "King of Spades" 같은 식으로 표현할 수 있습니다. 관례에 따라 새 카드는 우선 무늬를 기준으로 알파벳 순으로, 그리고 위에 나와 있는 값 순서대로 정렬됩니다.
입력
입력은 딜러가 알고 있는 섞이 방법의 개수인 100이하의 정수 n으로 시작됩니다. 그 다음 줄에는 52개의 정수가 n세트 나오는데 각 세트에는 1에서 52까지의 모든 정수가 들어있습니다. 52개의 정수로 구성된 각 세트내에서 j 위치에 i가 있다는 것은 패에서 i번째 카드를 j번째 위치로 이동시킨다는 것을 의미합니다.
그 뒤에는 각각 1 이상 n 이하의 정수 k가 들어있는 행이 여러 개 뒤따릅니다. 입력된 정수 k는 딜러가 k번째 섞기 방법을 썼다는 것을 나타냅니다.
출력
딜러가 위에 기술되어 있는 대로 정렬된 새로운 패를 가지고 시작한다고 가정하고 섞기가 모두 끝난 후에 새로운 순서에 따라서 카드의 이름을 출력합니다. 두 개의 서로 다른 케이스에 대한 출력 결과는 빈 줄로 구분합니다.
예제
2
2 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 52 51
52 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 1
King of Spades
2 of Clubs
4 of Clubs
5 of Clubs
6 of Clubs
7 of Clubs
8 of Clubs
9 of Clubs
10 of Clubs
Jack of Clubs
Queen of Clubs
King of Clubs
Ace of Clubs
2 of Diamonds
3 of Diamonds
4 of Diamonds
5 of Diamonds
6 of Diamonds
7 of Diamonds
8 of Diamonds
9 of Diamonds
10 of Diamonds
Jack of Diamonds
Queen of Diamonds
King of Diamonds
Ace of Diamonds
2 of Hearts
3 of Hearts
4 of Hearts
5 of Hearts
6 of Hearts
7 of Hearts
8 of Hearts
9 of Hearts
10 of Hearts
Jack of Hearts
Queen of Hearts
King of Hearts
Ace of Hearts
2 of Spades
3 of Spades
4 of Spades
5 of Spades
6 of Spades
7 of Spades
8 of Spades
9 of Spades
10 of Spades
Jack of Spades
Queen of Spades
Ace of Spades
3 of Clubs
해설
문제가 무슨 말을 하는지 몰라서 고생을 했다. 한국말로 써 있는데 한국 말인 것인지 이해가 안됐다. 그러다 1부터 52까지 써 있는 것이 새 카드의 덱(deck)이고, 입력 받은 case의 52개의 숫자와의 Diff로 섞기 방법을 계산하면 의외로 쉬운 문제라는 것을 알게 됐다. 이렇게 Diff로 얻어진 카드의 이동 순서를 기록해두고, 새 카드의(deck)에 순차적으로 적용하면 됐던 평이한 문제였다.
# Quiz 0013, Stack'em Up
# written by badsaram
import sys
class stackemup(object):
def __init__(self):
self.shuffle_list = []
self.num_cases = 0
def input(self, testflag):
if (testflag == True):
self.num_cases = 2
else:
str = input() # input number of test caess
self.num_cases = int(str)
for i in range(self.num_cases):
if (testflag == True):
if (i == 0):
str = "2 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 52 51"
else:
str = "52 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 1"
else:
str = input()
shf = shuffle()
ret = shf.input_case(str)
if (ret == True):
self.shuffle_list.append(shf)
else:
return False
return True
def calc(self):
ret = False
org_str = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52"
dck = deck()
ret = dck.input_deck(org_str)
if (len(self.shuffle_list) != 0):
tokens = org_str.split(' ')
for shuffle_case in self.shuffle_list:
dck.shuffle_apply(shuffle_case)
dck.print_deck()
ret = True
else:
ret = False
return ret
class deck(object):
def __init__(self):
self.deck_org = ""
self.deck_calc = []
def input_deck(self, str):
self.deck_org = str
tokens = self.deck_org.split(' ')
for i in range(len(tokens)):
if (tokens[i] != ''):
self.deck_calc.append(int(tokens[i]))
def shuffle_apply(self, shf):
shuffles = shf.get_shuffle()
deck_copy = self.deck_calc.copy()
for shuffle in shuffles:
deck_copy[shuffle[0]] = self.deck_calc[shuffle[1]]
self.deck_calc = deck_copy
def print_deck(self):
if (len(self.deck_calc) != 0):
for i in range(len(self.deck_calc)):
self.print_card(self.deck_calc[i])
def print_card(self, card_num):
mark = int((card_num - 1) / 13)
card = int((card_num - 1) % 13)
mark_string = [ "Clubs", "Diamonds", "Hearts", "Spades" ]
card_string = [ "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
print("%s of %s" % (card_string[card], mark_string[mark]))
class shuffle(object):
def __init__(self):
self.shuffle_org = ""
self.shuffle_calc = []
def input_case(self, str):
self.shuffle_org = str
tokens = self.shuffle_org.split(' ')
if (len(tokens) != 52):
return False
for i in range(len(tokens)):
if ((tokens[i] != '') and (int(tokens[i]) != (i + 1))):
self.shuffle_calc.append([i, int(tokens[i]) - 1])
return True
def print_case(self):
if (self.shuffle_org != ""):
tokens = self.shuffle_org.split(' ')
for i in range(len(tokens)):
if (tokens[i] != ''):
self.print_card(int(tokens[i]))
def print_card(self, card_num):
mark = int((card_num - 1) / 13)
card = int((card_num - 1) % 13)
mark_string = [ "Clubs", "Diamonds", "Hearts", "Spades" ]
card_string = [ "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
print("%s of %s" % (card_string[card], mark_string[mark]))
def print_diff(self):
if (len(self.shuffle_calc) != 0):
for diff in self.shuffle_calc:
print("%d %d" % (diff[0], diff[1]))
def get_shuffle(self):
return self.shuffle_calc
if __name__ == '__main__':
obj = stackemup()
obj.input(True)
obj.calc()
'코딩 테스트' 카테고리의 다른 글
문제 15 : 경시 대회 점수판(Contest Scoreboard) (0) | 2023.06.19 |
---|---|
문제 14 : 에르되시 수(Erdős Numbers) (0) | 2023.05.26 |
문제 12 : 암호 깨기 (Crypt Kicker) (0) | 2022.12.11 |
문제 11 : 동맹 휴업 (Hartal) (0) | 2022.08.26 |
문제 10 : 포커 패 (Poker Hands) (0) | 2022.08.08 |