백준(BOJ)
[Python/파이썬] - 백준(BOJ) 17192번 : 바둑이 포커
phanre
2022. 5. 16. 16:02
https://www.acmicpc.net/problem/17292
17292번: 바둑이 포커
첫째 줄에 임의의 카드 6장이 주어진다. 카드는 ','로 구분되어 있고, 같은 카드가 여러 번 주어지는 경우는 없다.
www.acmicpc.net
주어진 규칙에 따라 소트하는 문제이다.
seq, same, other 배열을 각각 생성하여 연속된 수 / 같은 수 / 그 외 배열을 분리한다.
이후 각각 배열 마다 1. 색이 같은 쌍 / 2. 큰 수가 큰 쪽 / 3. 작은 수가 큰 쪽 / 4. 큰 수가 검은색 조건에 맞게 lambda를 이용해 소트하였다.
1. 색이 같은 쌍
key=lambda x:x[1] == x[3],reverse=True
2. 큰 수가 큰 쪽
key=lambda x:max(int(x[0],16),int(x[2],16)),reverse=True
3. 작은 수가 큰 쪽
key=lambda x:min(int(x[0],16),int(x[2],16)),reverse=True
4. 큰 수가 검은색
key=lambda x:x[1] == 'b' if int(x[0],16) > int(x[2],16) else x[3] == 'b',reverse=True
lambda if else 조건문 이용
위의 네가지 조건을 순서대로 묶어 하나의 lambda식으로 이용하였다.
실제 코드
card = list(input().split(','))
n = len(card)
seq = []
same = []
other = []
for i in range(n-1):
for j in range(i+1, n):
a = int(card[i][0],16)
b = int(card[j][0],16)
if (a+1) % 15 == b % 15 or (b+1) % 15 == a % 15:
seq.append(card[i]+card[j])
elif card[i][0] == card[j][0]:
same.append(card[i]+card[j])
else:
other.append(card[i]+card[j])
seq.sort(key=lambda x:(x[1] == x[3], max(int(x[0],16),int(x[2],16)), min(int(x[0],16), int(x[2],16)), x[1] == 'b' if int(x[0],16) > int(x[2],16) else x[3] == 'b'), reverse=True)
same.sort(key=lambda x:(x[1] == x[3], max(int(x[0],16),int(x[2],16)), min(int(x[0],16), int(x[2],16)), x[1] == 'b' if int(x[0],16) > int(x[2],16) else x[3] == 'b'), reverse=True)
other.sort(key=lambda x:(x[1] == x[3], max(int(x[0],16),int(x[2],16)), min(int(x[0],16), int(x[2],16)), x[1] == 'b' if int(x[0],16) > int(x[2],16) else x[3] == 'b'), reverse=True)
print(*seq, *same, *other, sep='\n')