[BOJ] 16675 - 두 개의 손
사용 언어: Python3
문제
예제 분석
민성: 묵 찌
태경: 빠 묵
민성: 묵 / 태경: 빠 -> 태경 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('?')
💛 개인 공부 기록용 블로그입니다. 👻