관리 메뉴

cococo-coding

4493번. 가위 바위 보? (c++풀이) 본문

[BOJ] 코드 모음/C++_learning 문제집

4493번. 가위 바위 보? (c++풀이)

_dani 2024. 1. 9. 17:05

문제

풀이

가위바위보 자체만 놓고 승자를 찾는 문제라면 쉽게 풀었을 것 같은데, 테스트케이스 개수t 과 각 테스트케이스별 가위바위보 횟수n 에 맞춰서 푸는 문제라 복잡한 느낌을 받았다.

아래 코드를 보면 t를 먼저 입력받고, t를 반복해서 n을 입력받는다.

 

이렇게 반복되는 부분들이라면 변수들을 초기화하는 문장과 결과를 출력하는 문장을 어디에 두느냐가 중요하다.

아래 코드에서 //4에 해당하는 부분이 for문 안에 있으면 각 케이스별로의 승자를 출력하게 되므로, 문제에서 원하는 결과가 나오지 않는다.


주의) 잘못된 코드 - 문장의 위치가 반복문 안에 들어간 경우

  for (int i = 0; i < n; i++) {
            char p1, p2;
            cin >> p1 >> p2;

            //p1과 p2가 같은 것을 낸 경우(비긴경우)
            if (p1 == p2) same++;
            //p1이 이기는 경우 3가지
            else if (p1 == 'R' && p2 == 'S') p1win++;
            else if (p1 == 'P' && p2 == 'R') p1win++;
            else if (p1 == 'S' && p2 == 'P') p1win++;
            //남은 케이스는 p2가 이기는 경우 3가지
            else p2win++;

            //4 이 부분이 for문 안에 있는 경우 
            if (p1win > p2win) cout << "Player 1\n";
            else if (p1win < p2win) cout << "Player 2\n";
            else cout << "TIE\n";

        }

결과

 

우리가 원하는 결과는 각 테스트케이스별 승자이지만, 이렇게 되면 매번 가위바위보를 할 때마다 승자가 출력되게 된다.

아래는 승자를 출력하는 부분(//4)을 for문 밖에 두어 우리가 원하는 결과가 출력되도록 만든 코드이다.

코드

#include <iostream>
using namespace std;

/*
    1. 테스트케이스의 개수 t를 입력받는다.
    2. 각 테스트케이스의 가위바위보 횟수n을 입력받는다.
    3. 각 테스트케이스별로 R P S를 입력받는다.
    4. 각 테스트케이스의 승자를 찾는다.
    5. 승자를 출력한다.
*/

int main() {
    //1
    int t;
    cin >> t; 

    //2
    while (t--) {
        int n;
        cin >> n;

        //3
        int p1win=0, p2win=0, same=0;

        for (int i = 0; i < n; i++) {
            char p1, p2;
            cin >> p1 >> p2;

            //p1과 p2가 같은 것을 낸 경우(비긴경우)
            if (p1 == p2) same++;
            //p1이 이기는 경우 3가지
            else if (p1 == 'R' && p2 == 'S') p1win++;
            else if (p1 == 'P' && p2 == 'R') p1win++;
            else if (p1 == 'S' && p2 == 'P') p1win++;
            //남은 케이스는 p2가 이기는 경우 3가지
            else p2win++;
        }
            //4 
            if (p1win > p2win) cout << "Player 1\n";
            else if (p1win < p2win) cout << "Player 2\n";
            else cout << "TIE\n";
    }
}

후에 따로 사용자정의함수를 만들어서 승자를 판단하는 부분을 밖으로 빼도 괜찮을 것 같다.