백준 16675 두 개의 손

문제

민성이와 태경이는 고려대학교에서 알아주는 가위바위보의 최고수들이다. 이들은 기존의 가위바위보에 질린 나머지, 2개의 손을 모두 이용하여 가위바위보를 즐기는 경지에 이르렀다.

먼저, 둘이 동시에 “가위, 바위, 보”를 외치며 두 개의 손을 각각 가위, 바위, 보 중 하나로 설정하여 공개한다. 그 자리에서 서로 3초간 호흡을 가다듬은 후, 동시에 왼손을 낼지 오른손을 낼지를 결정한다. 민성이와 태경이는 최고수들끼리의 대결이라는 압박감에 의해 가끔 판단력이 흐려질 때가 있어서, 실수로 왼손과 오른손에 같은 동작을 취할 수도 있다.

당신은 민성이와 태경이의 왼손과 오른손의 상태가 주어졌을 때, 민성이 또는 태경이가 적절히 왼손 또는 오른손을 선택하여 가위바위보에서 무조건 이기는 방법이 있는지 없는지를 알려고 한다.

입력
첫 번째 줄에 차례로 ML, MR, TL, TR이 공백으로 구분되어 주어진다. 차례대로 민성이의 왼손과 오른손, 태경이의 왼손과 오른손의 상태를 나타낸다.
위 4개의 값들은 “S”, “R”, “P” 중 하나이며, 각각 가위, 바위, 보를 의미한다.

출력
첫 번째 줄에 민성이가 무조건 이길 수 있다면 “MS”, 태경이가 무조건 이길 수 있다면 “TK”, 누가 이길 지 확답할 수 없다면 “?”를 쌍따옴표를 제외하고 출력한다.
가위바위보에서 가위는 보를 이기고, 바위는 가위를 이기며, 보는 바위를 이긴다. 같은 손동작끼리는 승부가 나지 않는다 (비긴다).

예제 입력 1
R S P R

예제 출력 1
?

민성이는 왼손에 바위와 오른손에 가위를, 태경이는 왼손에 보와 오른손에 바위를 냈다. 이 상황에서는 민성이나 태경이 중 누가 이길 지 확실하지 않다.

예제 입력 2
R R S S

예제 출력 2
MS

예제 입력 3
P P S R

예제 출력 3
TK

풀이 과정

딕셔너리 자료형을 이용해 가위바위보의 상관관계를 나타낸다.

둘 다 왼손과 오른손으로 낸 것이 같을 때, 한 명만 같을 때를 파악한다.
한 명만 같은 것을 냈다면 다른 쪽이 상대방을 이길 수 있는 손을 가졌는지 본다.
아니라면 물음표를 출력

두 번째 코드에서, 민성이 손이 중복되고 태경이가 이길 수 있는 손이 있으면 태경이가 이긴다.
태경이 손이 중복되고 민성이가 이길 수 있으면 민성이가 이긴다.
이외에는 물음표가 출력된다.

세 번째 코드는 모듈러 연산과 in 연산자를 이용했다.

코드 1

data = input().split()
MS = data[:2]
TK = data[2:]
dic = {'R': 'P', 'P': 'S', 'S': 'R'}

if len(set(MS)) == 1 and len(set(TK)) == 1:
    if MS[0] == TK[0]:
        print('?')
    else:
        if dic[MS[0]] in TK:
            print('TK')
        else:
            print('MS')
elif len(set(MS)) == 1:
    if dic[MS[0]] in TK:
        print('TK')
    else:
        print('?')
elif len(set(TK)) == 1:
    if dic[TK[0]] in MS:
        print('MS')
    else:
        print('?')
else:
    print('?')

코드 2

data = input().split()
MS = list(set(data[:2]))
TK = list(set(data[2:]))
dic = {'R': 'P', 'P': 'S', 'S': 'R'}

if len(MS) == 1 and dic[MS[0]] in TK:
    print('TK')
elif len(TK) == 1 and dic[TK[0]] in MS:
    print('MS')
else:
    print('?')

코드 3

ML, MR, TL, TR = ('SPR'.index(i) for i in input().split())

if ML == MR and (ML + 2) % 3 in [TL, TR]:
    print('TK')
elif TL == TR and (TL + 2) % 3 in [ML, MR]:
    print('MS')
else:
    print('?')

백준 16675 두 개의 손

좋은 웹페이지 즐겨찾기