작년 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"); //잘못된 덱입니다. } }
다 되었네요. 작동 결과는 직접 테스트해 보시기 바랍니다 ㅋㅋ
다음에 또 다른 문제로 찾아뵙겠습니다 :)