[C++] 백준 16675 두 개의 손
2021. 4. 17.
반응형

www.acmicpc.net/problem/16675

 

16675번: 두 개의 손

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

www.acmicpc.net

 

1. 서론

 

가위바위보를 구현하는 시뮬레이션 문제이다. 가위바위보의 논리는 간단하지만 그걸 얼마나 잘 푸는지가 관건인 문제다. 난 내공이 부족해서 완전 코드가 엉망 ㅜ

 

2. 문제 풀이

 

두 사람이  양손으로 가위바위보를 한다. 그리고 3초 후에 왼손, 오른손 중 선택해서 가위바위보의 승패를 결정한다. 서로 낸 것을 보고 뭘 낼 것인지 결정하는데 그 승부를 예상할 수 없을 때는 '?'를 무조건 한 사람이 이기는 경우에는 이긴 사람의 이름을 출력하는 문제이다.

 

처음에 되게 난감했다. 코드를 논리적으로 짜야하는데 뭔가 방법이 생각나지 않아서 정말 모든 경우의 수를 처리해주는 코드를 짰다.

두 사람이 가위바위보를 했을 경우, 한 사람이 명확하게 다 이기는 경우라면 왼손, 오른손의 어떠한 경우에도 다 이기거나, 양손에 같은 것을 내서 상대방이 판단으로 이기는 것을 내는 경우. 그 외에 양쪽이 한 번이라도 이기는 경우가 있다면 승부는 어찌 될지 모르기에 '?'를 출력한다.

 

3. 코드 설명

 

#include <iostream>

using namespace std;

int calc(char a, char b)
{//0, 1, 2 이김, 짐, 비김
    if (a == 'R')
    {
        if(b == 'S') return 0;
        else if (b == 'R') return 2;
        else return 1;
    }
    if (a == 'S')
    {
        if(b == 'P') return 0;
        else if (b == 'S') return 2;
        else return 1;
    }
    if (a == 'P')
    {
        if(b == 'R') return 0;
        else if (b == 'P') return 2;
        else return 1;
    }
}

int main()
{
    char mr, ml, tr, tl;
    int m = 0, t = 0;

    cin >> mr >> ml >> tr >> tl;

    if (calc(mr, tr) == 0) m++;
    if (calc(mr, tr) == 1) t++;

    if (calc(mr, tl) == 0) m++;
    if (calc(mr, tl) == 1) t++;

    if (calc(ml, tr) == 0) m++;
    if (calc(ml, tr) == 1) t++;

    if (calc(ml, tl) == 0) m++;
    if (calc(ml, tl) == 1) t++;

    if (mr != ml && tr != tl)
    {
        if (m > 0 && t > 0)
            cout << "?" << endl;
        if (m == 4)
            cout << "MS" << endl;
        if (t == 4)
            cout << "TK" << endl;
    }
    else
    {
        if (mr == ml && t > 0)
            cout << "TK" << endl;
        else if (tr == tl && m > 0)
            cout << "MS" << endl;
        else
            cout << "?" << endl;
    }
}

 

코드가 엄청 더럽다 ㅜ

calc 함수에서는 가위바위보의 승패를 정해준다. a를 기준으로 이기면 0 지면 1 비기면 2를 return 한다.

그리고 민성이가 이기는 경우와 태경이가 이기는 경우를 count 한 후 둘 다 이기는 경우가 있을 때?

그리고 (왼, 오) * (왼, 오)의 경우의 수로 4개의 경우의 수가 모두 이긴다고 하는 경우 이긴 사람의 이름

그리고 그 외에 한 사람이 주먹 가위 보 중 다 같은 것을 내고 다른 사람이 이긴 경우가 있다면 무조건 한 사람이 이기게 되는 경우이므로 그 사람이 이기는 것으로 하고 나머지 경우는 모두 '?' 처리한다.

 

 

 

 

 

 

반응형
myoskin