티스토리 뷰
https://www.acmicpc.net/problem/17292
- 문제 :
앞면에는 1-15의 자연수, 뒷면은 검은색 또는 하얀색인 30장짜리 트럼프카드가 있다.
카드 한 장을 표현할 때는 숫자는 16진수, 색은 b/w로 한다. 예를 들어, 뒷면이 하얀색인 15는 fw로 표현한다.
카드를 두장씩 한쌍으로 약식포커를 진행하는데, 서열은 다음과 같이 정의되어 있다.
- 연속된 수 ( 1과 f는 연속합니다. )
- 같은 수
- 그 외
같은 서열 내에서는 다음과 같이 다시 서열을 정한다.
- 색이 같은 쌍
- 큰 수가 큰 쪽
- 작은 수가 큰 쪽
- 큰 수가 검은색
위와 같은 서열을 비교하며, 순차적으로 낮은 단계에서 비교가 안 될 경우만 다음 단계로 넘어가서 비교한다.
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])
'Algorithm > Sorting' 카테고리의 다른 글
(Python/파이썬) - 백준(BOJ) 1005번 : ACM Craft (0) | 2022.05.18 |
---|---|
(Python) - BOJ(10975번) : 데크 소트 2 (0) | 2022.03.02 |
(Python) - BOJ(11004번) : K번째 수 (0) | 2022.02.27 |
(Python) - BOJ(1302번) : 베스트셀러 (0) | 2022.02.23 |
(Python) - BOJ(20300번) : 서강근육맨 (0) | 2022.02.16 |