티스토리 뷰

728x90

https://www.acmicpc.net/problem/17292

 

17292번: 바둑이 포커

첫째 줄에 임의의 카드 6장이 주어진다.  카드는 ','로 구분되어 있고, 같은 카드가 여러 번 주어지는 경우는 없다.

www.acmicpc.net


  • 문제 : 

앞면에는 1-15의 자연수, 뒷면은 검은색 또는 하얀색인 30장짜리 트럼프카드가 있다.

카드 한 장을 표현할 때는 숫자는 16진수, 색은 b/w로 한다. 예를 들어, 뒷면이 하얀색인 15는 fw로 표현한다.

카드를 두장씩 한쌍으로 약식포커를 진행하는데, 서열은 다음과 같이 정의되어 있다.

 

  1. 연속된 수 ( 1과 f는 연속합니다. )
  2. 같은 수
  3. 그 외

 

같은 서열 내에서는 다음과 같이 다시 서열을 정한다.

 

  1. 색이 같은 쌍
  2. 큰 수가 큰 쪽
  3. 작은 수가 큰 쪽
  4. 큰 수가 검은색

 

위와 같은 서열을 비교하며, 순차적으로 낮은 단계에서 비교가 안 될 경우만 다음 단계로 넘어가서 비교한다.

6장의 서로 다른 카드를 입력 받을때, 그 카드들로 만들 수 있는 모든 쌍을 서열순으로 출력하시오. 단, 카드 쌍에서 두 장의 순서는 입력받은 카드 순서를 따른다.

 

 

 


  • 풀이 :

정렬 문제였습니다. 주어진 조건에 맞게 우선순위를 설정하여 정렬해주면 됩니다.

 

풀이입니다.

 

1. 아래 변수들을 통해 문제에서 주어진 조건에 맞게 우선순위를 설정합니다. python의 list 기본 sort가 오름차순이기 때문에 우선순위가 더 높은 항목을 -1로 설정하였습니다.

continued = [-1 if (i1+1)%15 == i2%15 or (i2+1)%15 == i1%15 else 1] # 연속된 경우
same = [-1 if i1 == i2 else 1] # 같은 경우
another = [-1 if continued == 1 and same == 1 else 1] # 그 외 경우
colorSame = [-1 if s1[1] == s2[1] else 1] # 색이 같은 경우
maxValue = -max(i1,i2) # 큰 수
minValue = -min(i1,i2) # 작은 수
maxColor = [s1[1] if i1 > i2 else s2[1]] # 큰 수의 색

 

2. combinations 모듈을 통해 주어진 카드 6장으로 만들 수 있는 모든 조합을 구하고, 각 조합에 대해 1번에서 구한 변수들을 cards 배열에 삽입합니다.

 

3. cards 배열을 sort의 key를 사용하여 0번 요소부터 6번 요소까지 비교하며 오름차순 정렬합니다.

 

cards.sort(key = lambda x : (x[0],x[1],x[2],x[3],x[4],x[5],x[6]))

위 구문을 해석하자면 cards를 정렬하는데 key값으로 x[0]~ x[6]의 값을 사용하겠다는 의미입니다.

만약 해당 요소의 값이 동일하다면 (예를 들어, 두 조합이 모두 값이 연속될 경우 x[0]은 -1이다. 따라서 x[1]에 따라 우선순위가 달라진다.) 그 다음 요소를 통해 순서를 결정합니다.

 

추가 ) 두 숫자가 연속되는지 확인하는 과정에서 (i1+1)%15를 i2값과 비교하는 방법을 사용하였습니다.

이 때, i2도 %15한 값과 비교해야 모든 경우를 확인할 수 있습니다.

 

예를 들어, ebfb인 경우 e = 14, f = 15입니다. 

이 때, (14+1)%15 == 15는 0 == 15 와 같은 의미로 False를 반환하게 됩니다.

이런 케이스를 배제하기 위해 우항에도 %15를 붙여주어야 합니다. 

 


  • 소스코드 : 
import sys
from itertools import combinations
input = sys.stdin.readline

cards = []
for s1,s2 in list(combinations(input().strip().split(","),2)):
    s = s1+s2
    i1 = int(s1[0],16)
    i2 = int(s2[0],16)
    continued = [-1 if (i1+1)%15 == i2%15 or (i2+1)%15 == i1%15 else 1] # 연속된 경우
    same = [-1 if i1 == i2 else 1] # 같은 경우
    another = [-1 if continued == 1 and same == 1 else 1] # 그 외 경우
    colorSame = [-1 if s1[1] == s2[1] else 1] # 색이 같은 경우
    maxValue = -max(i1,i2) # 큰 수
    minValue = -min(i1,i2) # 작은 수
    maxColor = [s1[1] if i1 > i2 else s2[1]] # 큰 수의 색
    cards.append([continued, same, another, colorSame, maxValue, minValue, maxColor, s])

cards.sort(key = lambda x : (x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7]))
for card in cards:
    print(card[-1])

 

320x100
댓글
© 2022 WonSeok, All rights reserved