백준 5597 - 자바

손찬호·2024년 6월 6일
0

알고리즘

목록 보기
59/91

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

풀이 아이디어

n이 입력되면 1~2*n까지의 카드가 있고
상근이가 n개를 카드를 받으면 근상이는 나머지 n개의 카드를 가진다.
상근이,근상이가 가진 카드 각각을 ArrayList<Integer>에 담고 오름차순으로 정렬한다.
카드를 내는 규칙에 따라 어떻게 구현할지 아이디어를 정리해봤다.

  • 놓인 카드가 없다면 원하는 카드를 낼 수 있다.
    이때 카드는 1이상의 숫자이므로 놓인 카드 값 currentOnCard = 0으로 할당한다.
  • 각자 낼 수 있는 카드에서 가장 작은 숫자가 적힌 카드를 낸다.
    작은 경우에만 낼 수 있도록 한다.
if(drawCard>currentOnCard){
	currentOnCard = drawCard;
	SGcards.remove(i);
	break;
}   
  • 낼 카드가 없는 경우 상대의 차례가 된다. 이때 자리에 나와있는 카드는 없어진다.
    어떤 카드를 낼지 정하기 전에 카드의 ArrayList의 사이즈를 beforeSize에 저장하고
    for문으로 낼 카드를 확인 후에 카드의 ArrayList의 사이즈를 afterSize에 저장한다.
    카드를 내지 않았다면 beforeSize와 afterSize가 같으므로
    자리에 나와있는 카드가 없어지고 이를 currentOnCard = 0로 표현했다.
// 상근이가 카드를 낸다.
beforeSize = SGcards.size();
for(int i=0;i<SGcards.size();i++){
    // 현재 놓인 카드보다 크면 카드를 내기
    int drawCard = SGcards.get(i);
    if(drawCard>currentOnCard){
        currentOnCard = drawCard;
        SGcards.remove(i);
        break;
    }    
}
afterSize = SGcards.size();
// 낼 카드가 없는 경우 
if(beforeSize==afterSize){
    currentOnCard = 0;
}

풀이 코드

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

public class _5587 {
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int n = Integer.parseInt(br.readLine());
        ArrayList<Integer> SGcards = new ArrayList<>();
        ArrayList<Integer> GScards = new ArrayList<>();
        for(int i=0;i<n;i++){
            SGcards.add(Integer.parseInt(br.readLine()));
        }
        for(int i=1;i<=2*n;i++){
            if(!SGcards.contains(i)){
                GScards.add(i);
            }
        }
        Collections.sort(SGcards);
        Collections.sort(GScards);

        // System.out.println(SGcards);
        // System.out.println(GScards);

        CardGame(SGcards, GScards);
    }

    static void CardGame(ArrayList<Integer> SGcards, ArrayList<Integer> GScards){
        int currentOnCard = 0; // 현재 놓여있는 카드

        int beforeSize = 0;
        int afterSize = 0;
        
        // 둘 중 하나라도 전부 비우기 전까지 계속 진행한다.
        while(true){
            // 상근이가 카드를 낸다.
            beforeSize = SGcards.size();
            for(int i=0;i<SGcards.size();i++){
                // 현재 놓인 카드보다 크면 카드를 내기
                int drawCard = SGcards.get(i);
                if(drawCard>currentOnCard){
                    currentOnCard = drawCard;
                    SGcards.remove(i);
                    break;
                }    
            }
            afterSize = SGcards.size();
            // 낼 카드가 없는 경우 
            if(beforeSize==afterSize){
                currentOnCard = 0;
            }
            // 카드를 비우면 종료
            if(afterSize==0){
                break;
            }

            // 근상이가 카드를 낸다.
            beforeSize = GScards.size();
            for(int i=0;i<GScards.size();i++){
                // 현재 놓인 카드보다 크면 카드를 내기
                int drawCard = GScards.get(i);
                if(drawCard>currentOnCard){
                    currentOnCard = drawCard;
                    GScards.remove(i);
                    break;
                }    
            }
            afterSize = GScards.size();
            // 낼 카드가 없는 경우 
            if(beforeSize==afterSize){
                currentOnCard = 0;
            }
            // 카드를 비우면 종료
            if(afterSize==0){
                break;
            }
        }

        // 상대가 가진 갯수 출력
        System.out.println(GScards.size());
        System.out.println(SGcards.size());
    }
}
profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보