<commit_before>package kr.rodumani.minecraft;

public class EnglishToKorean {
    // 코드타입 - 초성, 중성, 종성
    enum CodeType{chosung, jungsung, jongsung}

    // 초성
    private String initial = "rRseEfaqQtTdwWczxvg";
    // 중성
    private String[] mid = {"k","o","i","O","j","p","u","P","h","hk", "ho","hl","y","n","nj","np", "nl", "b", "m", "ml", "l"};
    // 종성
    private String[] fin = {"r", "R", "rt", "s", "sw", "sg", "e", "f", "fr", "fa", "fq", "ft", "fx", "fv", "fg", "a", "q", "qt", "t", "T", "d", "w", "c", "z", "x", "v", "g"};


    /**
     * 영어를 한글로...
     */
    public String engToKor(String eng){
        StringBuffer sb = new StringBuffer();
        int initialCode = 0, medialCode = 0, finalCode = 0;
        int tempMedialCode, tempFinalCode;

        for(int i = 0; i < eng.length(); i++){

            // 공백을 검사
            if (eng.substring(i, i+1).equals(" ")) {
                sb.append(" ");
                continue;
            }

            // 초성코드 추출
            initialCode = getCode(CodeType.chosung, eng.substring(i, i+1));
            i++; // 다음문자로


            // 중성코드 추출
            tempMedialCode = getDoubleMedial(i, eng);   // 두 자로 이루어진 중성코드 추출
            if (tempMedialCode != -1) {
                medialCode = tempMedialCode;
                i += 2;
            }
            else {            // 없다면,
                medialCode = getSingleMedial(i, eng);   // 한 자로 이루어진 중성코드 추출
                i++;
            }


            // 종성코드 추출
            tempFinalCode = getDoubleFinal(i, eng);    // 두 자로 이루어진 종성코드 추출
            if (tempFinalCode != -1) {
                finalCode = tempFinalCode;
                // 그 다음의 중성 문자에 대한 코드를 추출한다.
                tempMedialCode = getSingleMedial(i+2, eng);
                if (tempMedialCode != -1) {      // 코드 값이 있을 경우
                    finalCode = getSingleFinal(i, eng);   // 종성 코드 값을 저장한다.
                } else {
                    i++;
                }
            }
            else {            // 코드 값이 없을 경우 ,
                tempMedialCode = getSingleMedial(i+1, eng);  // 그 다음의 중성 문자에 대한 코드 추출.
                if(tempMedialCode != -1) {      // 그 다음에 중성 문자가 존재할 경우,
                    finalCode = 0;        // 종성 문자는 없음.
                    i--;
                } else {
                    if ((i+2) < eng.length() && eng.substring(i, i+1).equals(" ")) { // 다음글자가 공백일 경우 종성문자는 없음
                        finalCode = 0;
                        i--;
                    }
                    finalCode = getSingleFinal(i, eng);   // 종성 문자 추출
                    if (finalCode == -1)
                        finalCode = 0;
                }
            }

            // 추출한 초성 문자 코드, 중성 문자 코드, 종성 문자 코드를 합한 후 변환하여 스트링버퍼에 넘김
            sb.append((char)(0xAC00 + initialCode + medialCode + finalCode));
        }
        return sb.toString();
    }

    /**
     * 해당 문자에 따른 코드를 추출한다.
     * @param type 초성 : chosung, 중성 : jungsung, 종성 : jongsung 구분
     * @param char 해당 문자
     */
    private int getCode(CodeType type, String c){
        switch(type){
            case chosung :
                int index = initial.indexOf(c);
                if( index != -1 ){
                    return index * 21 * 28;
                }
                break;
            case jungsung :

                for(int i = 0; i < mid.length; i++){
                    if(mid[i].equals(c)){
                        return i * 28;
                    }
                }
                break;
            case jongsung :
                for(int i = 0; i < fin.length; i++){
                    if(fin[i].equals(c)){
                        return i + 1;
                    }
                }
                break;
            default:
                System.out.println("잘못된 타입 입니다");
        }

        return -1;
    }

    // 한 자로 된 중성값을 리턴한다
    // 인덱스를 벗어낫다면 -1을 리턴
    private int getSingleMedial(int i, String eng){
        if((i+1) <= eng.length()){
            return getCode(CodeType.jungsung, eng.substring(i, i+1));
        }else{
            return -1;
        }
    }

    // 두 자로 된 중성을 체크하고, 있다면 값을 리턴한다.
    // 없으면 리턴값은 -1
    private int getDoubleMedial(int i, String eng){
        int result;
        if((i+2) > eng.length()){
            return -1;
        }else{
            result = getCode(CodeType.jungsung, eng.substring(i, i+2));
            if(result != -1){
                return result;
            }else{
                return -1;
            }
        }
    }

    // 한 자로된 종성값을 리턴한다
    // 인덱스를 벗어낫다면 -1을 리턴
    private int getSingleFinal(int i, String eng){
        if((i+1) <= eng.length()){
            return getCode(CodeType.jongsung, eng.substring(i, i+1));
        }else{
            return -1;
        }
    }

    // 두 자로된 종성을 체크하고, 있다면 값을 리턴한다.
    // 없으면 리턴값은 -1
    private int getDoubleFinal(int i, String eng){
        if((i+2) > eng.length()){
            return -1;
        }else{
            return getCode(CodeType.jongsung, eng.substring(i, i+2));
        }
    }
}

<commit_msg>특수문자 표현 반영<commit_after>package kr.rodumani.minecraft;

public class EnglishToKorean {
    // 코드타입 - 초성, 중성, 종성
    enum CodeType{chosung, jungsung, jongsung}

    // 초성
    private String initial = "rRseEfaqQtTdwWczxvg";
    // 중성
    private String[] mid = {"k","o","i","O","j","p","u","P","h","hk", "ho","hl","y","n","nj","np", "nl", "b", "m", "ml", "l"};
    // 종성
    private String[] fin = {"r", "R", "rt", "s", "sw", "sg", "e", "f", "fr", "fa", "fq", "ft", "fx", "fv", "fg", "a", "q", "qt", "t", "T", "d", "w", "c", "z", "x", "v", "g"};

    private boolean isAlpha(String name) {
        return name.matches("[a-zA-Z]+");
    }

    public static void main(String[] args) {
        EnglishToKorean etk = new EnglishToKorean();
        System.out.println(etk.engToKor("xptmxm?"));
    }

    /**
     * 영어를 한글로...
     */
    public String engToKor(String eng) {
        StringBuffer sb = new StringBuffer();
        int initialCode = 0, medialCode = 0, finalCode = 0;
        int tempMedialCode, tempFinalCode;

        for(int i = 0; i < eng.length(); i++){

            // 특수문자를 검사
            if (!isAlpha(eng.substring(i, i+1))) {
                sb.append(eng.substring(i, i+1));
                continue;
            }

            // 초성코드 추출
            initialCode = getCode(CodeType.chosung, eng.substring(i, i+1));
            i++; // 다음문자로


            // 중성코드 추출
            tempMedialCode = getDoubleMedial(i, eng);   // 두 자로 이루어진 중성코드 추출
            if (tempMedialCode != -1) {
                medialCode = tempMedialCode;
                i += 2;
            }
            else {            // 없다면,
                medialCode = getSingleMedial(i, eng);   // 한 자로 이루어진 중성코드 추출
                i++;
            }


            // 종성코드 추출
            tempFinalCode = getDoubleFinal(i, eng);    // 두 자로 이루어진 종성코드 추출
            if (tempFinalCode != -1) {
                finalCode = tempFinalCode;
                // 그 다음의 중성 문자에 대한 코드를 추출한다.
                tempMedialCode = getSingleMedial(i+2, eng);
                if (tempMedialCode != -1) {      // 코드 값이 있을 경우
                    finalCode = getSingleFinal(i, eng);   // 종성 코드 값을 저장한다.
                } else {
                    i++;
                }
            }
            else {            // 코드 값이 없을 경우 ,
                tempMedialCode = getSingleMedial(i+1, eng);  // 그 다음의 중성 문자에 대한 코드 추출.
                if(tempMedialCode != -1) {      // 그 다음에 중성 문자가 존재할 경우,
                    finalCode = 0;        // 종성 문자는 없음.
                    i--;
                } else {
                    if (i < eng.length() && !isAlpha(eng.substring(i, i+1))) { // 다음글자가 특수문자일 경우 종성문자는 없음
                        finalCode = 0;
                        i--;
                    }
                    finalCode = getSingleFinal(i, eng);   // 종성 문자 추출
                    if (finalCode == -1)
                        finalCode = 0;
                }
            }

            // 추출한 초성 문자 코드, 중성 문자 코드, 종성 문자 코드를 합한 후 변환하여 스트링버퍼에 넘김
            sb.append((char)(0xAC00 + initialCode + medialCode + finalCode));
        }
        return sb.toString();
    }

    /**
     * 해당 문자에 따른 코드를 추출한다.
     * @param type 초성 : chosung, 중성 : jungsung, 종성 : jongsung 구분
     * @param char 해당 문자
     */
    private int getCode(CodeType type, String c){
        switch(type){
            case chosung :
                int index = initial.indexOf(c);
                if( index != -1 ){
                    return index * 21 * 28;
                }
                break;
            case jungsung :

                for(int i = 0; i < mid.length; i++){
                    if(mid[i].equals(c)){
                        return i * 28;
                    }
                }
                break;
            case jongsung :
                for(int i = 0; i < fin.length; i++){
                    if(fin[i].equals(c)){
                        return i + 1;
                    }
                }
                break;
            default:
                System.out.println("잘못된 타입 입니다");
        }

        return -1;
    }

    // 한 자로 된 중성값을 리턴한다
    // 인덱스를 벗어낫다면 -1을 리턴
    private int getSingleMedial(int i, String eng){
        if((i+1) <= eng.length()){
            return getCode(CodeType.jungsung, eng.substring(i, i+1));
        }else{
            return -1;
        }
    }

    // 두 자로 된 중성을 체크하고, 있다면 값을 리턴한다.
    // 없으면 리턴값은 -1
    private int getDoubleMedial(int i, String eng){
        int result;
        if((i+2) > eng.length()){
            return -1;
        }else{
            result = getCode(CodeType.jungsung, eng.substring(i, i+2));
            if(result != -1){
                return result;
            }else{
                return -1;
            }
        }
    }

    // 한 자로된 종성값을 리턴한다
    // 인덱스를 벗어낫다면 -1을 리턴
    private int getSingleFinal(int i, String eng){
        if((i+1) <= eng.length()){
            return getCode(CodeType.jongsung, eng.substring(i, i+1));
        }else{
            return -1;
        }
    }

    // 두 자로된 종성을 체크하고, 있다면 값을 리턴한다.
    // 없으면 리턴값은 -1
    private int getDoubleFinal(int i, String eng){
        if((i+2) > eng.length()){
            return -1;
        }else{
            return getCode(CodeType.jongsung, eng.substring(i, i+2));
        }
    }
}


{'fraction_non_alphanumeric': 0.1393227903366644, 'fraction_numerical': 0.009896187057339672, 'mean_word_length': 1.1587434554973821, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5214049', 'n_tokens_mistral': 3984, 'n_tokens_neox': 4372, 'n_words': 863}