Problem:
Problem P04: CamelCase

プログラミングにおける識別子（変数や関数）の命名では、
単語を連結した複合語が使われる。
しかし、そのまま連結すると単語の区切りがわからなくなるため、
一般的に以下の命名規則の中から統一するものを選び適用する：

Upper CamelCase　にする

単語を直接連結し複合語とし、各単語の先頭文字のみを大文字にする。

例： GetUserName

Lower CamelCase　にする

単語を直接連結し複合語とし、各単語の先頭文字のみを大文字にする。ただし、複合語の先頭文字は小文字にする。

例： getUserName

アンダースコアで繋ぐ

単語をアンダースコアで連結し複合語とする。単語の文字はすべて小文字にする。

例： get_user_name

与えられた識別子を、指定された命名規則を適用して出力するプログラムを作成せよ。
与えられる識別子は、上記の命名規則のいづれかが既に適用されているものとする。

Input

入力として複数のデータセットが与えられる。各データセットは以下の形式で与えられる：

name type （識別子、命名規則：　空白区切りの文字列と文字）

typeは命名規則を示す文字であり、以下の表の通りとする：

type

命名規則

U

Upper CamelCase にする

L

Lower CamelCase にする

D

アンダースコアで繋ぐ

与えられる識別子の文字数は 1 以上 100 以下である。

type が 'X' のとき入力の終わりとする。この入力に対する出力を行ってはならない。

Output

各データセットについて、命名規則を適用した識別子を1行に出力せよ。

Sample Input

get_user_name L
getUserName U
GetUserName D
EndOfInput X

Output for the Sample Input

getUserName
GetUserName
get_user_name

Solution in JAVA (judge verdict: Wrong Answer)

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(true){
			final String input = sc.next();
			final String type = sc.next();
			
			if("X".equals(type)){
				break;
			}
			
			char[][] units;
			
			if(input.indexOf("_") >= 0){
				String[] ret = input.split("_");
				units = new char[ret.length][];
				for(int i = 0; i < ret.length; i++){
					units[i] = ret[i].toCharArray();
				}
			}else{
				char[] array = input.toCharArray();
				
				int count = 0;
				for(int i = 1; i < array.length; i++){
					if('A' <= array[i] && array[i] <= 'Z'){
						count++;
					}
				}
				count++;
				
				units = new char[count][];
				
				int start = 0;
				int cur = 0;
				for(int i = 1; i < array.length; i++){
					if('A' <= array[i] && array[i] <= 'Z'){
						final int size = i - start;
						
						units[cur] = new char[size];
						for(int j = 0; j < size; j++){
							if(j == 0){
								if('A' <= array[start + j] && array[start + j] <= 'Z'){
									units[cur][j] = (char) (array[start + j] - ('A' - 'a'));
								}else{
									units[cur][j] = array[start + j];
								}
							}else{
								units[cur][j] = array[start + j];
							}
						}
						
						start = i;
						cur++;
					}
				}
				
				final int size = input.length() - start;
				units[cur] = new char[size];
				for(int j = 0; j < size; j++){
					if(j == 0){
						units[cur][j] = (char) (array[start + j] - ('A' - 'a'));
					}else{
						units[cur][j] = array[start + j];
					}
				}
			}
			/*
			for(char[] ch : units){
				System.out.println(Arrays.toString(ch));
			}
			*/
			if("L".equals(type)){
				for(int i = 0; i < units.length; i++){
					for(int j = 0; j < units[i].length; j++){
						System.out.print((char)(units[i][j] + (j == 0 && i != 0 ? 'A' - 'a' : 0)));
					}
				}
				
				System.out.println();
			}else if("U".equals(type)){
				for(int i = 0; i < units.length; i++){
					for(int j = 0; j < units[i].length; j++){
						System.out.print((char)(units[i][j] + (j == 0 ? 'A' - 'a' : 0)));
					}
				}
				
				System.out.println();
			}else if("D".equals(type)){
				for(int i = 0; i < units.length; i++){
					for(int j = 0; j < units[i].length; j++){
						System.out.print(units[i][j]);
					}
					
					if(i != units.length - 1){
						System.out.print("_");
					}
				}
				
				System.out.println();
			}
		}
		
	}

}