길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Backtracking

[백준 16986번] 인싸들의 가위바위보 (C/C++)

2022. 3. 31. 13:37

https://www.acmicpc.net/problem/16986

 

16986번: 인싸들의 가위바위보

두 사람이 같은 손동작을 내어 무승부가 발생할 경우 경기 진행 순서상 뒤인 사람이 이긴 것으로 간주함에 다시 한 번 유의한다. 구체적으로, 경기 진행 순서는 지우, 경희, 민호 순으로 고정되

www.acmicpc.net


인싸들의 가위바위보 문제는 백트래킹을 이용하여 해결할 수 있습니다.

백트래킹은 next_permutation 함수를 사용하여 수행할 수 있습니다.

손동작 수가 N개일 때,  1 ~ N으로 이루어진 순열의 각 경우의 수에 대해 게임을 진행하면 됩니다. 

 

아래는 전체 코드입니다.

#include <bits/stdc++.h>
using namespace std;

int table[9][9];
int b[20], c[20];

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, k; cin >> n >> k;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            cin >> table[i][j];

    vector<int> a;

    for(int i = 1; i <= n; i++) a.push_back(i); // 지우가 낼 손동작 순서
    for(int i = 0; i < 20; i++) cin >> b[i];    // 경희가 낼 손동작 순서
    for(int i = 0; i < 20; i++) cin >> c[i];    // 민호가 낼 손동작 순서
    
    int ans = 0;
    do{
        int ho[3] = {0, 0, 0};  // 지우, 경희, 민호가 낼 손동작 idx
        int s[3] = {0, 0, 0};   // 지우, 경희, 민호의 승수
        int win = -1; // 우승자
        int cur = 0, nx = 1;    // cur와 nx가 경기
        deque<int> order = {2};   // 경기 진행 순서, 0은 지우, 1은 경희, 2는 민호 

        while(true){
            int ch, nh; // cur가 낼 손동작, nh가 낼 손동작
            if(cur == 0) ch = a[ho[0]++]; else if(cur == 1) ch = b[ho[1]++]; else ch = c[ho[2]++];
            if(nx == 0) nh = a[ho[0]++]; else if(nx == 1) nh = b[ho[1]++]; else nh = c[ho[2]++];

            int r = table[ch-1][nh-1];
            if(r == 0 || (r == 1 && cur < nx)){ // nx가 이긴 경우
                s[nx]++;
                order.push_back(cur);
                cur = nx; nx = order.front(); 
                order.pop_front(); 
            }else if(r == 2 || (r == 1 && nx < cur) ){    // cur가 이긴 경우
                s[cur]++;
                order.push_back(nx);
                nx = order.front(); 
                order.pop_front(); 
            }
            int mi = max_element(s, s+3) - s;   // 승수가 가장 높은 사람의 idx

            if(s[mi] == k) {win = mi; break;}   // 우승을 위해 필요한 승수가 채워진 경우
            if(ho[0] >= n) break;   // 지우가 더이상 낼 손동작이 없는 경우
        }
        // 게임 종료 후
        if(win == 0) {ans = 1; break;}  // 지우가 이긴 경우
    }while(next_permutation(a.begin(), a.end()));   // 지우의 손동작 순서의 각 경우의 수에 대해 게임 진행
    cout << ans;
}

'Algorithm > Backtracking' 카테고리의 다른 글

백트래킹(Backtracking)이란?  (0) 2022.11.02
[백준 16953번] A → B (C++)  (0) 2022.04.07
[백준 17626번] Four Squares (C++)  (0) 2022.04.05
    'Algorithm/Backtracking' 카테고리의 다른 글
    • 백트래킹(Backtracking)이란?
    • [백준 16953번] A → B (C++)
    • [백준 17626번] Four Squares (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바