3 분 소요

사용 언어: Python3

문제

백준 16675

스크린샷 2023-03-30 오후 2 20 47 스크린샷 2023-03-30 오후 2 20 37

예제 분석

민성: 묵 찌
태경: 빠 묵

민성: 묵 / 태경: 빠 -> 태경 win
민성: 묵 / 태경: 묵 -> draw
민성: 찌 / 태경: 빠 -> 민성 win
민성: 찌 / 태경: 묵 -> 태경 win

민성: 빠 빠
태경: 찌 묵

민성: 빠 / 태경: 찌 -> 태경 win
민성: 빠 / 태경: 묵 -> 민성 win
민성: 빠 / 태경: 찌 -> 태경 win
민성: 빠 / 태경: 묵 -> 민성 win
태경이가 찌를 내면 무조건 이김

코드

내 풀이

# 민성 왼,오 / 태경 왼,오
# S: 가위, R: 바위, P: 보
ML, MR, TL, TR = input().split()

# 한 사람이 똑같은 패를 냈을 때, 다른 사람이 그것에 대한 이기는 패를 가지고 있다면 무조건 승리 가능
def judge(ML, MR, TL, TR):
  if ML == MR and TL == TR: # 민성,태경 왼==오
    if ML=='R':
      if TL == 'S':
        return 'MS'
      elif TL == 'P':
        return 'TK'
    if ML=='S':
      if TL == 'P':
        return 'MS'
      elif TL == 'R':
        return 'TK'
    if ML=='P':
      if TL == 'R':
        return 'MS'
      elif TL == 'S':
        return 'TK'
  if ML == MR: # 민성 왼==오
    if ML == 'R':
      if TL == 'P' or TR == 'P':
        return 'TK' # 태경 win
    elif ML == 'S':
      if TL == 'R' or TR == 'R':
        return 'TK' # 태경 win
    else: # ML == 'P'
      if TL == 'S' or TR == 'S':
        return 'TK' # 태경 win
  if TL == TR: # 태경 왼==오
    if TL == 'R':
      if ML == 'P' or MR == 'P':
        return 'MS' # 민성 win
    elif TL == 'S':
      if ML == 'R' or MR == 'R':
        return 'MS' # 민성 win
    else: # ML == 'P'
      if ML == 'S' or MR == 'S':
        return 'MS' # 민성 win
  return "?"
  
print(judge(ML, MR, TL, TR))
  • 조건문이 너무 더럽다.. 이렇게 하는게 맞나..?

다른 풀이

ML, MR, TL, TR = ('RSP'.index(x) for x in input().split()) # ✅ R,S,P를 0,1,2로 매칭 # 'RSP'.find(x)도 가능

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('?')
  • ('RSP'.index(x) for x in input().split())
    • ‘RSP’의 인덱스 번호로 저장
    • 예) S는 1로 저장
  • 가위, 바위, 보가 순환 형태라는 것에서 규칙을 찾을 수 있다.
    R(바위): 0 / S(가위): 1 / P(보): 2 라고 한다면,
    0은 1을 이기고
    1은 2를 이기고
    2는 0을 이긴다
    
    -> 🌟 이런식으로 싸이클이 생긴다면 mod(%) 연산을 사용하면 좋다!
    
  • if ML == MR and (ML + 2) % 3 in [TL, TR]:
    상대방이 이기는 경우에 대해 생각해보자.
    내가 똑같은 패를 냈을 때, 상대방이 그것에 대해 이기는 패를 가지고 있다면 무조건 승리할 수 있다.
    
    만약 내가 R(=0)일 때, 상대방이 P(=2)를 가지고 있으면 승리 가능
    만약 내가 S(=1)일 때, 상대방이 R(=0)를 가지고 있으면 승리 가능
    만약 내가 P(=2)일 때, 상대방이 S(=1)를 가지고 있으면 승리 가능
    
    -> 🌟 상대방이 (내가 가진 것 + 2) % 3 을 가지고 있으면 승리할 수 있다.
    
  • find()index()의 차이점
    • find()
      • 찾는 문자가 없는 경우에 -1을 출력한다.
      • 문자열을 찾을 수 있는 변수는 문자열만 사용이 가능하다. 리스트, 튜플, 딕셔너리 자료형에서는 find 함수를 사용할 수 없다. 만일 사용하게 되면 AttributeError 에러가 발생한다.
    • index()
      • 찾는 문자가 없는 경우에 ValueError 에러가 발생한다.
      • 문자열, 리스트, 튜플 자료형에서 사용 가능하고 딕셔너리 자료형에는 사용할 수 없어 AttributeError 에러가 발생한다.

또 다른 풀이

# 딕셔너리로 매칭 테이블 만들어도 된다.
# key = 어떤 패, value = 그걸 이기는 패
judge = {
  'R': 'P',
  'S': 'R',
  'P': 'S'
}

ML, MR, TL, TR = input().split()

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


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기