백준(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')