본문 바로가기

예전글/손 가는 대로 풀어보는 알고리즘

[NYPC 2016] 마비노기 듀얼: 올바른 덱인가요? (Java)

 


 작년 8월 8일, 정말 운수 좋게도 <NYPC 토크콘서트 : 코딩하는 대로>를 들으러 갈 수 있었습니다. 현재 넥슨에서 개발자, 디자이너 등으로 일하고 계신 분들의 이야기를 들을 수 있어서 참 좋았습니다. 4차 산업혁명으 대비해서 길러야 할 역량에 관한 이야기도 있어서 참 잘 들었다 싶었습니다.


 뭐 NYPC 토크콘서트 감상평 글이 아니니까요, 그냥 이 문제를 보다 보니 생각났습니다. 사실 이 문제, 예전에 프로그래밍은 잘 하지도 못할 때 풀어 본 문제인데, 옛날 글들 뒤져 보다가 나와서 여기에 올려 봅니다. 그땐 머리 꽁꽁 싸매고 했는데, 지금 와서 보니까 또 감회가 새롭네요... 일단 문제를 볼까요? 원본 링크는 [여기] 있습니다. 원본에는 예시가 네 개나 있는데, 그 정도까진 필요 없으니 그냥 자르겠습니다. 

 아래 더보기 버튼을 누르시면 여기서도 보실 수 있습니다.



 네... 그러니까, 덱을 구성하는 카드들의 종류가 3개보다 많으면 안 된다는 거죠? 일단, 입력을 받아 봅시다. 크기가 N인 String 배열 하나를 선언하면 되겠죠?

import java.util.Scanner;

class Main
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        
        String[] deck = new String[N];
        for(int i = 0 ; i < N ; i++)
            deck[i] = sc.next();
    }
}


 덱을 만들었습니다. 이제 저기서 소개해준 대로 gold(골드), mana(마나), light(빛), dark(어둠), nature(자연) 얘네가 몇 종류나 들어가 있는지 확인해 봅시다. 방법이야 여러가지인데요, 저는 int형 배열 하나랑 변수 하나를 추가로 선언해서 사용했습니다. 

 배열 하나는 각 종류의 카드가 몇 장씩 있는지 세기 위함이구요, 변수 하나는 종류가 몇 종류인지 세기 위함입니다. 배열의 이름은 cardKinds, 변수 이름은 cnt로 합시다. cardKinds[0]은 골드 카드의 개수, cardKinds[1]은 마나 카드의 개수... 이렇게 하나씩 정해 줍니다.

 카드를 세어야 하는데요, 위에 12번째 행에서 sc.next();로 deck에 카드를 넣었는데, 이걸 switch문으로 바로 cardKinds의 수를 늘려 봅시다. cardKinds의 각 원소의 수를 1씩 늘리면 되겠죠? 구현해 봅시다.

import java.util.Scanner;

class Main
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        
        String[] deck = new String[N];
        
        int cardKinds[] = {0,0,0,0,0};
        int cnt = 0;
        
        for(int i = 0 ; i < N ; i++)
        {
            deck[i] = sc.next(); //카드를 입력받습니다.
            switch(deck[i])
            {
                case "gold" : //카드가 gold면
                    cardKinds[0]++; //cardKinds[] = {[0]+1,[1],[2],[3],[4]}
                    break;
                case "mana" : //카드가 mana면
                    cardKinds[1]++; //cardKinds[] = {[0].[1]+1,[2],[3],[4]}
                    break; 
                case "light" ://카드가 light면
                    cardKinds[2]++; //cardKinds[] = {[0].[1],[2]+1,[3],[4]}
                    break;
                case "dark" : //카드가 dark면
                    cardKinds[3]++; //cardKinds[] = {[0].[1],[2],[3]+1,[4]}
                    break;
                case "nature"://카드가 nature면
                    cardKinds[4]++; //cardKinds[] = {[0].[1]+1,[2],[3],[4]+1}
                    break;        
            }
        }
        
    }
}

 만약 gold 카드가 1장, mana가 2장, light가 3장이면 cardKinds는 {1,2,3,0,0}이 됩니다.

 이제 미리 선언해 놓은 cnt (0)을 쓸 차례입니다. cardKinds가 1 이상이라는 것은 몇 장이든지 그 카드가 들어간 것이므로, 올바른 덱이 3종류 이하의 카드가 들어가야 하니까 cardKinds[1]~cardKinds[4]중에서 1 이상인 게 하나 있을 때마다 cnt를 1씩 증가시켜 줍니다.

 올바른 덱일 때 valid, 잘못된 덱일 때 invalid를 출력해야 하므로 if문을 이용합니다.

import java.util.Scanner;

class Main
{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        
        String[] deck = new String[N];
        
        int cardKinds[] = {0,0,0,0,0};
        int cnt = 0;
        
        for(int i = 0 ; i < N ; i++)
        {
            deck[i] = sc.next(); //카드를 입력받습니다.
            switch(deck[i])
            {
                case "gold" :
                    cardKinds[0]++;
                    break;
                case "mana" :
                    cardKinds[1]++;
                    break; 
                case "light" :
                    cardKinds[2]++;
                    break;
                case "dark" :
                    cardKinds[3]++;
                    break;
                case "nature":
                    cardKinds[4]++;
                    break;        
            }
        }
        
        for(int i = 0 ; i < 5 ; i++)
            if(cardKinds[i] > 0) //cardKinds[i]가 0보다 크다면(카드가 있다면)
                cnt++; //cnt를 1 증가시킵니다.
        
        if(cnt <= 3) //들어간 카드의 종류가 3종류 이하면
            System.out.println("valid"); //올바른 덱입니다.
        else //3종류보다 많다면
            System.out.println("invalid"); //잘못된 덱입니다.
    }
}

 다 되었네요. 작동 결과는 직접 테스트해 보시기 바랍니다 ㅋㅋ


 다음에 또 다른 문제로 찾아뵙겠습니다 :)