2015. 3. 8. 02:15
Posted by 곽중선
2015. 3. 8. 02:13


DigiGroupAsStr2.java


package digitGroup;

/**
 * 10진수를 입력받아, 천(1000)자리 구분자를 추가하는 프로그램.
 */
public class DigiGroupAsStr2 {

	public static void main(String args[]) {

		int loopCount = 1000000;
		for (int idx = 0; idx < 10; idx++) {
			long startMilliTime = System.currentTimeMillis();
			benchmark(10, 10, loopCount);
			long endMilliTime = System.currentTimeMillis();
			System.out.println(loopCount + ";"
					+ (endMilliTime - startMilliTime));
			loopCount += 1000000;
		}
	}

	private static void benchmark(int startNum, int interval, int loopCount) {
		int inputNumber = startNum;
		for (int cnt = 0; cnt < loopCount; cnt++) {
			convert(inputNumber);
			inputNumber += interval;
		}
	}

	private static String convert(int number) {
		final char THOUSANDS_SEPARATOR = ',';

		// 입력 숫자를 문자열 타입으로 변환
		String numberAsStr = String.valueOf(number);
		StringBuilder sb = new StringBuilder(numberAsStr.length() / 3
				+ numberAsStr.length());

		// 맨 앞부분에서 잘라낼 길이를 계산하고, 출력 버퍼에 담는다.
		int firstPos = numberAsStr.length() % 3;
		int charIdx = 0;
		for(; charIdx<firstPos; charIdx++) {
			sb.append(numberAsStr.charAt(charIdx));
		}
		
		int counter = 0;
		for(; charIdx<numberAsStr.length(); charIdx++) {
			if(counter % 3 == 0 && numberAsStr.length() > 3) {
				sb.append(THOUSANDS_SEPARATOR);
			} 
			counter ++;
			sb.append(numberAsStr.charAt(charIdx));
		}

		return sb.toString();
	}

}

Posted by 곽중선
2015. 3. 8. 02:11


DigiGroupAsStr.java


package digitGroup;

/**
 * 10진수를 입력받아, 천(1000)자리 구분자를 추가하는 프로그램.
 */
public class DigiGroupAsStr {
    
    public static void main(String args[]) {
        
		int loopCount = 1000000;
		for(int idx=0; idx<10; idx++) {
			long startMilliTime = System.currentTimeMillis();
			benchmark(10, 10, loopCount);
			long endMilliTime = System.currentTimeMillis();
			System.out.println( loopCount + ";" + (endMilliTime - startMilliTime));
			loopCount += 1000000;
		}
    }

	private static void benchmark(int startNum, int interval, int loopCount) {
		int inputNumber = startNum; 
		for(int cnt=0; cnt<loopCount; cnt++) {
			convert(inputNumber);
			inputNumber += interval;
		}
	}

    private static String convert(int number) {
        final char THOUSANDS_SEPARATOR = ',';
        StringBuilder sb = new StringBuilder();
        
        // 입력 숫자를 문자열 타입으로 변환
        String numberAsStr = String.valueOf(number);

        // 맨 앞부분에서 잘라낼 길이를 계산하고, 출력 버퍼에 담는다.
        int separationIndex = numberAsStr.length() % 3;
        sb.append(numberAsStr.substring(0, separationIndex));
        
        // 숫자의 나머지를 3자리씩 잘라서 구분자와 함께 추가한다.
        while(separationIndex < numberAsStr.length()) {
            if(separationIndex > 0) {
                sb.append(THOUSANDS_SEPARATOR);
            }
            sb.append(numberAsStr.substring(separationIndex, 
                      separationIndex+3));
            separationIndex += 3;
        }
        
        return sb.toString();
    }

}
Posted by 곽중선
2015. 3. 8. 02:05
DigitGroupAsInt.java
package digitGroup;

import java.util.Stack;

/**
 * 10진수를 입력받아, 천(1000)자리 구분자를 추가하는 프로그램.
 * (숫자 타입 처리 및 수행 시간 측정)
 */
public class DigitGroupAsInt {

	public static void main(String args[]) {
		int loopCount = 1000000;
		for(int idx=0; idx<10; idx++) {
			long startMilliTime = System.currentTimeMillis();
			benchmark(10, 10, loopCount);
			long endMilliTime = System.currentTimeMillis();
			System.out.println( loopCount + ";" + (endMilliTime - startMilliTime));
			loopCount += 1000000;
		}
	}
	
	private static void benchmark(int startNum, int interval, int loopCount) {
		int inputNumber = startNum; 
		for(int cnt=0; cnt<loopCount; cnt++) {
			convert(inputNumber);
			inputNumber += interval;
		}
	}

	private static String convert(int number) {
		final int DECIMAL_NUMBER = 10;
		final char THOUSANDS_SEPARATOR = ',';

		Stack<Character> digitStack = new Stack<Character>();
		StringBuilder sb = new StringBuilder();

		int quotient, spare, count = 0;
		do {
			// 몫과 나머지 계산
			quotient = number / DECIMAL_NUMBER;
			spare = number % DECIMAL_NUMBER;

			// 몫을 n 에 재할당, 나머지는 스택에 추가
			number = quotient;
			digitStack.push(Character.forDigit(spare, 10));

			// 3개의 숫자를 추가했다면, 구분자를 버퍼에 추가
			if (++count == 3 && quotient > 0) {
				digitStack.push(THOUSANDS_SEPARATOR);
				count = 0;
			}

		} while (quotient > 0);

		// 스택에 저장된 숫자를 꺼내 문자열 버퍼에 추가
		while (!digitStack.empty()) {
			sb.append(digitStack.pop());
		}

		return sb.toString();
	}

}
Posted by 곽중선