BOJ_16675 두 개의 손
- TOC {:toc}
이 글은 백준 온라인 저지의 16675번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.
일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.
2021.08.10
메모리 | 시간 | 코드 길이 |
---|---|---|
KB | ms | B |
단계 | 시작 시각 | 끝난 시각 | 걸린 시간 |
---|---|---|---|
문제 이해 | 14:51:29 | 14:53:26 | |
풀이 생각 1 | 14:53:28 | 14:59:00 | |
코딩 1 | 14:59:03 | 15:16:08 | |
풀이 생각 2 | 15:16:10 | 15:20:02 | |
코딩 2 | 15:20:03 | 15:37:28 |
RSP = {"R": 0, "S": 1, "P": 2}
def is_win(a, b):
cal = RSP[a] - RSP[b]
# a가 이기는 경우
if cal == -1 or cal == 2:
return 1
else:
return 0
ML, MR, TL, TR = input().split()
# M는 다른 거 냈을 경우
if ML != MR:
# T가 다른 걸 내면
if TL != TR:
print("?")
# T가 같은걸 내고 M이 둘 중 하나라도 이길 수 있는 경우
elif is_win(ML, TL) or is_win(MR, TL):
print("MS")
else:
print("?")
# M이 같은 걸 내고 T는 다른 걸 냈을 경우
elif TL != TR:
if is_win(TL, ML) or is_win(TR, ML):
print("TK")
else:
print("?")
# 둘 다 같은 걸 냈을 경우
else:
if is_win(ML, TL):
print("MS")
elif is_win(TL, ML):
print("TK")
else:
print("?")
아이디어 & 풀이
- 케이스에 따라서 승자를 출력한다.
피드백
- 인덱스로 관리를 하려다가 인덱스를 찾는 데 시간 때문에 하지 않았는데 인풋이 적어서 시간에 거의 영향을 안 미치는 것 같다.
- 훨씬 더 간결하게 작성할 있는 방법을 고민해 볼 걸 그랬다.
2023.02.19 (JS)
메모리 | 시간 | 코드 길이 |
---|---|---|
9324 KB | 124 ms | 595 B |
단계 | 시작 시각 | 끝난 시각 | 걸린 시간 |
---|---|---|---|
문제 이해 | 18:31:21 | 18:31:44 | |
풀이 생각 | 18:32:15 | 18:36:56 | |
코딩 | 18:36:57 | 18:41:10 |
const fs = require("fs");
const input = fs.readFileSync('/dev/stdin').toString().trim();
function isWin(A, B) {
if (A - B === -1 || A - B === 2) {
return true;
}
return false;
}
function main() {
const RSP = { R: 0, S: 1, P: 2 };
const [ML, MR, TL, TR] = input.split(" ").map((c) => RSP[c]);
if ((isWin(ML, TL) && isWin(ML, TR)) || (isWin(MR, TL) && isWin(MR, TR))) {
return "MS";
} else if ((isWin(TL, ML) && isWin(TL, MR)) || (isWin(TR, ML) && isWin(TR, MR))) {
return "TK";
} else {
return "?";
}
}
console.log(main());
피드백
- 둘 다 다른 것을 내면 승부가 나지 않는다는 것을 고려하면 더 깔끔하게 짤 수 있었을 것 같다.
참고 답안
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("?")
# 연산과 인덱스 노테이션을 사용해 코드를 짧게 작성
ML, MR, TL, TR = map("SRP".find, input()[::2])
print(
["?", "TK", "MS"][
(ML == MR) * ((ML + 1) % 3 in {TL, TR}) + 2 * (TL == TR) * ((TL + 1) % 3 in {ML, MR})
]
)
아이디어 & 풀이
인덱스를 이용해서 가위바위보와 승패를 관리한다.
-
각 승패 관계를 표로 나타내보자.
패 승 가위(0) 바위(2) 보(1) 가위(0) 바위(2) 보(1) -
승 - 패 사이의 관계에서 A가 낸 것이
i
라면 B가(i + 2) % 3
를 냈을 때 이길 수 있다는 것을 알 수 있다.
승부의 경우는 다음과 같다.
- 둘 다 다른 것을 내면 승부가 나지 않는다:
?
출력 - 민성이가 같은 것을 내고, 태경이가 이를 이기는 패를 내면 태경이가 이긴다:
TK
출력- 이기는 패는
(태경의 패 + 2) % 3
로 이 값이 민성의 패인[TL, TR]
안에 있나 확인하면 된다.
- 이기는 패는
- 태경이가 같은 것을 내고, 민성이가 이를 이기는 패를 내면 민성이가 이긴다:
MS
출력
-
ps-python ps-js