[백준/파이썬] 2930번 가위 바위 보 풀이

업데이트:



문제 정보


풀이

문제

가위 바위 보는 두 사람이 즐기는 유명한 게임이다. 각 플레이어는 자신의 손을 이용해서 가위, 바위, 보 중 한 모양을 만들어야 한다. 두 플레이어가 같은 모양을 만든 경우에는 비기게 된다. 가위는 보를 이기고, 보는 바위, 바위는 가위를 이긴다.

상근이는 사람들의 심리를 수십년동안 연구한 결과 가위 바위 보를 한국에서 가장 잘 하는 사람이 되었다. 상근이는 일대일 가위 바위 보를 절대로 지지 않는다.

한국에 적수가 없다고 판단한 상근이는 세계 대회에 나가기로 했다. 요즘 상근이는 세계 대회를 대비해 훈련중이다. 훈련은 친구 N명과 동시에 한다. 가위바위보는 총 R개의 라운드로 이루어져 있고, 각 라운드마다 상근이와 친구들은 세 모양중 하나를 만들어야 한다.

각 라운드의 점수 계산은 상근이와 친구 개개인을 독립적으로 비교한다. 상근이가 이기면 2점, 비기면 1점, 지면 0점이다.

상근이와 친구들이 각 라운드에 낸 모양이 주어졌을 때, 게임이 끝나고 난 후 상근이의 점수를 구한다. 그 다음, 상근이가 친구들이 무엇을 낼지 미리 알고있었다고 가정할 때, 상근이가 얻을 수 있는 최고 점수를 구하는 프로그램을 작성하시오.

  • 자세한 문제 및 입출력 예제는 상단의 문제 출처(백준 홈페이지)를 참조해주세요

코드

r = int(input())
s = input()
n = int(input())
fs = [input() for _ in range(n)]

rsp = {'R':0,'S':1,'P':2}

cs = ms = 0
for i in range(r):
    ts = [[0,'R'],[0,'S'],[0,'P']]
    for j in range(n):
        if (rsp[s[i]] + 1) % 3 == rsp[fs[j][i]]: cs += 2
        elif s[i] == fs[j][i]: cs += 1

        for t in ts:
            if (rsp[t[1]] + 1) % 3 == rsp[fs[j][i]]: t[0] += 2
            elif t[1] == fs[j][i]: t[0] += 1
    ms += max(ts)[0]
print(cs)
print(ms)

설명

가위 바위 보는 승패 관계가 순환하는 구조입니다.

단순 비교하는 반복문으로도 풀 수 있지만, 나머지 연산을 이용하면 한줄로도 깔끔하게 비교가 가능합니다.

상근이의 점수는 개개인별로 비교하여 점수의 총 합을 내면 됩니다.

반면, 얻을 수 있는 최고 점수의 경우는 약간 다릅니다.

가위 바위 보는 다행히도 각 라운드에 낼 수 있는 수의 경우가 3으로, 매우 작습니다.

이런 경우는 브루트 포스 알고리즘, 쉽게 말해 다 때려 넣어보기를 사용하여 각 라운드마다 가장 높은 점수만 더해주면 됩니다.



댓글남기기