숫자를 한글로 읽기


메이플스토리를 하다보면 한글날에 데미지 스킨을 주는데,  이 데미지 스킨을 사용하면

숫자로 출력하던 데미지들이 한글로 변경이 됩니다!


그럼 자바를 통해서 숫자를 한글로 읽을 수 있도록 하는 문제를 풀어봅시다.


[제한사항]

주어진 숫자 num는 1조 미만의 숫자 입니다.

1의 자릿수 이상에서의 1은 "일"로 읽지 않고 공백으로 취급합니다.

ex)1231 의 경우 

"일천이백삼십일" (X)

"천이백삼십일" (O)


[입출력 예]

1234

"천이백삼십사" 


49032

 "사만구천삼십이"


[문제 풀이]

import java.util.*;

public static void main(String[] args) {

// TODO Auto-generated method stub

int num;

Scanner s = new Scanner(System.in);  //숫자 num을 입력 받습니다.

num = s.nextInt();

String answer = "";

    

    String num_string = String.valueOf(num);  //int형은 substring이 안되기 때문에 문자형으로 받아 주어야 합니다.


        String[] han1 = {"","일","이","삼","사","오","육","칠","팔","구"};

        String[] han2 = {"","십","백","천"}; //십, 백,천 단위를 구분하기 위해 배열을 선언 합니다.

        String[] han3 = {"","만","억"};  // 천단위로 끊어서 단위가 올라가기 때문에 만이상 단를 구분해 줄 배열을 선언합니다.


        StringBuffer result = new StringBuffer();  // StringBuffer 선언

        int num_len = num_string.length();      // num의 길이 측정


        for(int i=num_len-1; i>=0; i--){  

           // 십단위 이상의 1은 읽지 않기 때문에 마지막 일을 제외한 1의 경우 "일"로 읽지 않음

            if(han1[Integer.parseInt(num_string.substring(num_len-i-1, num_len-i))]=="일" && num_len-i != num_len) {

                result.append(han1[0]);

            //System.out.println(result.append(han1[0])); 디버깅용

            }

            else { 

                result.append(han1[Integer.parseInt(num_string.substring(num_len-i-1, num_len-i))]);

            //System.out.println(result.append(han1[Integer.parseInt(num_string.substring(num_len-i-1, num_len-i))])); //디버깅용

            }

            // i는 자릿 수 이기 떄문에 4로 나눈 나머지가  3이면  천 / 나머지가 2이면 백 / 나머지가 1이면 십 /4로 나누어떨어지면 안읽음

   // 9090과 같이 0을 제외한 백단위 이상 숫자를 구분하여 읽기 위한 조건문

                if(Integer.parseInt(num_string.substring(num_len-i-1, num_len-i))>0);

                result.append(han2[i%4]);

            //System.out.println(result.append(han2[i%4])); //디버깅용

            //만단위 이상으로 올라갈 경우 처리하기 위함

            if(i%4==0)

            //System.out.println(result.append(han3[i/3])); //디버깅용

            result.append(han3[i/3]); 

            

        }

      //   result.append(han1[Integer.parseInt(num_string.substring(num_len-1, num_len))]); //디버깅용

        answer = result.toString(); // String Buffer랑 String이랑 다르기 때문에 String Buffer를 String으로 변경해주어야 합니다.

   //System.out.println(restult); // String으로 retrun할거 아니면 result 그대로 출력하면 됩니다.

     System.out.println(answer);

}

----------------------------------------------------------------------------------------------------------------------------------------------

for문을 돌릴때 0부터 시작하게 한다면 어떻게 작성해야할지 궁금해서 for문의 조건문 중 i를 0부터 시작하도록 변경 해 보았습니다.


[for문 0부터 시작 차이점]

 for(int i=0; i<num_len; i++){

        // 십단위 이상의 1은 읽지 않기때문에 0으로 설정하고 마지막 자리가 1일때만 읽도록 수정

    /* 초록색으로 표기된 부분이 변경된 부분입니다. */

   // num은 0부터 시작하기에 1을 빼주어야 정확한 계산이 가능 해집니다.

            if(han1[Integer.parseInt(num_string.substring(i, i+1))]=="일" && i != num_len-1) {

                result.append(han1[0]);

            //System.out.println(result.append(han1[0]));

            }

            else {

                result.append(han1[Integer.parseInt(num_string.substring(i, i+1))]);            

            }

           //i는 자릿 수 이기 떄문에 4로 나눈 나머지가  3이면  천 / 나머지가 2이면 백 / 나머지가 1이면 십 /4로 나누어떨어지면 안읽음

                if(Integer.parseInt(num_string.substring(i, i+1)));

                result.append(han2[(num_len-1-i)%4]);

              //System.out.println("천 단위 계산 :"+result.append(han2[(num_len-1-i)%4]));

           

            //만단위 이상으로 올라갈 경우 처리하기 위함

            if((num_len-1-i)%4==0)

            result.append(han3[(num_len-1-i)/3]);

//%로 계산하면 나머지가 다시 1로 떨어지는 경우 만을 출력하기 때문에 나눈 값의 몫으로 계산해야 만단위 이상에도 에러가 나지 않습니다.

            //System.out.println("만 단위 계산 : "+result.append(han3[(num_len-1-i)/3])); 

            //result.append(han3[i/3]);

        }

        


결국 조건문만 변경하면 똑같은 문제인것 같습니다.  계산 속도에서 당연 차이는 없어보이네요..

실행 시간은 O(n)이 되겠네요








 

+ Recent posts