숫자를 한글로 읽기
메이플스토리를 하다보면 한글날에 데미지 스킨을 주는데, 이 데미지 스킨을 사용하면
숫자로 출력하던 데미지들이 한글로 변경이 됩니다!
그럼 자바를 통해서 숫자를 한글로 읽을 수 있도록 하는 문제를 풀어봅시다.
[제한사항]
주어진 숫자 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)이 되겠네요
'알고리즘 공부 > 알고리즘 문제' 카테고리의 다른 글
문자열 내 맘대로 정렬하기 (0) | 2019.03.12 |
---|---|
빙고 개수 카운트하기 (0) | 2019.01.31 |
배열 회전 결과값 확인하기 (1) | 2019.01.26 |
도로에 가로등 전구 달기 (0) | 2019.01.26 |
완주하지 못한 선수 (0) | 2018.12.10 |