백준 20923 - 숫자 할리갈리 게임

Updated:

Java

20923 번 - 숫자 할리갈리 게임

문제

게임을 M 번 진행한 후 승리한 사람은 누구일까?

접근 방법

문제를 이해하기 정말 힘들었다.

도도부터 시작하여 카드를 한장 그라운드로 내린다.
그라운드에 있는 카드의 제일 윗면이 5이면 도도가 종을 치고, 카드 윗면의 합이 5이면 수연이 종을친다.

내가 착각했던 부분이 종을 쳤을때, 게임 수가 줄어드는 것이 아니라, 카드를 한번 내릴 때 게임 진행 수가 차감 된다.

카드 더미와 그라운드 더미를 둘다 Deque을 사용하여 구현하였으며,
Deque의 마지막 값(pollLast())가 카드의 윗면이라고 생각하였다.
따라서 둘 중 한명이 게임을 이기면, 그라운드 더미의 아래부터 카드를 뽑아(pollFirst()) 카드 더미의 아래에 넣는다(addFirst())

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, m, result;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	n = stoi(stk.nextToken());
    	m = stoi(stk.nextToken());
    	
    	Deque<Integer> dodo = new ArrayDeque<>();
    	Deque<Integer> susu = new ArrayDeque<>();
    	
    	for(int i = 0; i < n; i++) {
    		stk = new StringTokenizer(br.readLine());
    		dodo.add(stoi(stk.nextToken()));
    		susu.add(stoi(stk.nextToken()));
    	}
    	
    	Deque<Integer> doG = new ArrayDeque<>();
    	Deque<Integer> suG = new ArrayDeque<>();
    	int num;
    	// 도도가 이기면 false, 수연이 이기면 true
    	boolean winner;
    	while(true) {
    		
    		// 도도가 카드를 놓는다.
    		num = dodo.pollLast();
    		doG.addLast(num);
    		
    		if(dodo.isEmpty()) {
    			winner = true;		// 수연 승리
    			break;
    		}
    		
    		// 도도가 이겼을 경우
    		if(num == 5) {
    			while(!suG.isEmpty()) {
    				dodo.addFirst(suG.pollFirst());
    			}
    			while(!doG.isEmpty()) {
    				dodo.addFirst(doG.pollFirst());
    			}
    		}
    		
    		// 수연이 이겼을 경우
    		if(!doG.isEmpty() && !suG.isEmpty() && doG.peekLast() + suG.peekLast() == 5) {
    			while(!doG.isEmpty()) {
    				susu.addFirst(doG.pollFirst());
    			}
    			while(!suG.isEmpty()) {
    				susu.addFirst(suG.pollFirst());
    			}
    		}
			m--;
    		if(m == 0) break;
    		
    		// 수연이 카드를 놓는다.
    		num = susu.pollLast();
    		suG.addLast(num);
    		
    		if(susu.isEmpty()) {
    			winner = false;		// 도도 승리
    			break;
    		}
    		
    		// 도도가 이겼을 경우
    		if(num == 5) {
    			while(!suG.isEmpty()) {
    				dodo.addFirst(suG.pollFirst());
    			}
    			while(!doG.isEmpty()) {
    				dodo.addFirst(doG.pollFirst());
    			}
    		}
    		
    		// 수연이 이겼을 경우
    		if(!doG.isEmpty() && !suG.isEmpty() && doG.peekLast() + suG.peekLast() == 5) {
    			while(!doG.isEmpty()) {
    				susu.addFirst(doG.pollFirst());
    			}
    			while(!suG.isEmpty()) {
    				susu.addFirst(suG.pollFirst());
    			}
    		}
			m--;
    		if(m == 0) break;
    	}
    	
    	winner = dodo.size() > susu.size() ? false : true;
    	
    	if(dodo.size() == susu.size())
    		System.out.println("dosu");
    	else if(winner)
    		System.out.println("su");
    	else
    		System.out.println("do");
    	br.close();
	}

	
	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

개선할 점

없습니다.