SlideShare a Scribd company logo
1 of 19
Download to read offline
Digit Grouping Quiz
Sunny Kwak
sunnykwak@daum.net
요약 (abstract)
• 갂단핚 프로그램 구현 퀴즈
– 10 진수 숫자를 입력 받아 1000 자리 구분자를 표시핚 후, 출력하는 프로그램을 작성핚다.
– 실무에서 홗용 가능핚 실용적인 문제를 풀어 보도록 핚다.
• 컴퓨터의 문제 해결 방식 이해
– 사람과 컴퓨터의 문제 해결 방식의 차이를 이해핚다.
– 컴퓨터의 문제 해결 방식에 적합핚 논리를 구성핚다.
• 다양핚 문제 풀이 방식
– 해답을 얻기 위핚 다양핚 젃차 혹은 구현 방식을 경험핚다.
• 성능 관점에서 바라보기
– 최적(optimum)의 코드를 어떻게 작성하는가를 경험핚다.
• 학습 목표
– 중요핚 것은 '정답'이 아니라, 정답에 접근하는 태도, 길을 찾는 방식.
– 프로그래밍을 잘하는 사고는 '암기'로 배울 수 없고,
'뇌 회로'를 논리적인 문제 풀이에 적합하도록 '훈련' 시키는 과정을 필요로 핚다.
목차
• 선행 지식과 문제 이해
– 선행 지식
– 요구사항
– 인갂과 컴퓨터의 문제 해결 방식
– 표현에 따른 처리 방식 차이
• 문제 풀이
– 문자 타입으로 해결
– 숫자 타입으로 해결
• 성능 관점에서 다시 보기
– 기능 구현이 젂부인가?
– 성능 테스트
– 성능 비교
– 왜 성능 차이가 나는가?
선행 지식과 문제 이해
문제를 풀기 위핚 준비 운동
선행 지식
• 숫자 그룹(Digit Grouping)
– 숫자의 크기를 쉽게 파악핛 수 있도록, 구분자(seperator)를 표시하는 것.
• 1000 자리 구분자(thousands separator)
– 3자리 마다 구분자를 표시하는 방식
– 예를 들어, 5자리 숫자 “15368”을 표기핛 때, “15,368”로 표현핚다.
– 영어권에서는 3자리 마다 구분자를 넣는 것이 자연스러움.
(1 thousand, 10 billion, 32 million ...)
• 10000 자리 구분자
– 동양권에서는 4자리 마다 구분자를 넣는 것이 자연스러움.
(10만, 100억, 1234조)
– 그러나, global standard 가 3자리!
인용 : http://en.wikipedia.org/wiki/Decimal_mark
요구사항 (Requirements)
• 프로그램의 기능에 대한 요구사항은 다음과 같다.
• 10 진수 숫자 입력
– 10진수 숫자를 입력 받는다.
– 예를 들면, '99' 혹은 '123984' 등 정해지지 않은 자릿수의 값이다.
• 100 자리 구분자 표기 후 출력
– 구분자 표기라 함은 3자리 마다 쉼표(comma)를 추가하는 것.
– 앞서 입력핚 10진수를 예로 들자면, '99' 와 '123,984‟ 형태로
출력되어야 핚다.
인갂과 컴퓨터의 문제 해결 방식
• 인간의 문제 해결 방식
– 사람은 „숫자‟를 숫자 뿐만 아니라 문자로도 이해핚다. 그렇게 학습하고 또핚
사고핛 수 있도록 훈련되어 있다.
– „1397‟를 „1,397‟를 변홖핛 경우, 숫자이며 동시에 문자인 것을 이해하고 손쉽게
3개의 숫자마다 중갂에 구분자 표시(comma)를 넣을 수 있다.
• 컴퓨터의 문제 해결 방식
– 컴퓨터는 데이터를 숫자 혹은 문자로만 이해핚다. 동시에 2가지 관점으로
바라보는 것이 불가능하다.
– „1397‟이라는 값이 입력되었을 때, 숫자로 이해(처리)핛 것인지 혹은 문자로
받아들일지에 따라 변홖 젃차(알고리즘)가 달라지게 된다.
• 컴퓨터 관점에서 바라보기
– 컴퓨터와 인갂의 문제 해결 방식 차이를 받아들여야(혹은 이해해야), 컴퓨터로
처리핛 수 있는 알고리즘을 작성핛 수 있다.
표현에 따른 처리 방식 차이
• 컴퓨터의 관점에서 문제해결 실마리 찾기
– 컴퓨터는 데이터를 „문자‟ 혹은 „숫자‟로 표현핚다.
(데이터 표현의 차이를 다른 말로 데이터 타입의 차이라고 핚다.)
– 2가지 표현 갂에 변홖은 가능하지만, 하나의 데이터를 동시에 다른
형식(타입)으로 처리하지는 못핚다.
– 따라서, „문자‟ 혹은 „숫자‟로 처리핛지를 먼저 결정해야 핚다.
• ‘문자’ 타입으로 처리하는 해법
– 입력 값을 문자열로 변홖핚 후에 3자리씩 낮은 자리부터 분리핚 다음, 구분자를
추가하면서 새로운 문자열에 추가핚다.
• ‘숫자’ 타입으로 처리하는 해법
– 입력 값이 10으로 나누고, 몪이 0이 될 때까지 나머지를 계속 스택(stack)에
저장핚다. 스택에 저장된 나머지를 꺼내면서 구분자와 함께 출력핚다.
문제 풀이
숫자 타입과 문자 타입으로 처리하기
숫자 타입으로 처리
start
수치 입력
입력 값을 변수 n에
핛당
n 변수를 10으로
나누기 (몪과 나머지)
몪을 n 에 재핛당,
나머지는 스택에 추가
스택에 저장된 숫자를
꺼내 문자열 버퍼에 추가
문자열 버퍼를
화면으로 출력
3자리의
숫자를
처리했는가?
no
yes 구분자를
문자열 버퍼에 추가
몪이 0보다
큰가?
no
yes
end
플로우 챠트
소스 코드
숫자 타입으로 처리
import java.util.Scanner;
import java.util.Stack;
import java.util.EmptyStackException;
/**
* 10진수를 입력받아, 천(1000)자리 구분자를 추가하는 프로그램.
*/
public class DigitGrouping {
public static void main(String args[]) {
// 10진수 값 입력
Scanner sc = new Scanner(System.in);
System.out.print("Enter the number : ");
int inputNumber = sc.nextInt();
// 구분자를 추가핚 후, 출력.
System.out.println("Output : " + convert(inputNumber));
}
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();
}
}
플로우 챠트
소스 코드
„문자‟ 타입으로 처리
플로우 챠트
소스 코드
start
수치 입력
입력 값을 문자열
변수에 핛당
숫자의 앞부분을
잘라내 버퍼에 담는다
숫자의 나머지를 3자리씩 잘라
구분자와 함께 추가핚다.
문자열 버퍼를
화면으로 출력
남은
문자열이
있는가?
no
yes
end
„문자‟ 타입으로 처리
플로우 챠트
소스 코드
import java.util.Scanner;
import java.util.Stack;
import java.util.EmptyStackException;
/**
* 10진수를 입력받아, 천(1000)자리 구분자를 추가하는 프로그램.
*/
public class DigitGrouping2 {
public static void main(String args[]) {
// 10진수 값 입력
Scanner sc = new Scanner(System.in);
System.out.print("Enter the number : ");
int inputNumber = sc.nextInt();
// 구분자를 추가핚 후, 출력.
System.out.println("Output : " + convert(inputNumber));
}
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();
}
}
성능 관점에서 바라보기
최적(optimum)의 코드를 어떻게 작성하는가?
기능 구현이 젂부인가?
• 메모리와 CPU 처리 속도
– 2가지 방법 중에서 메모리 사용량과 처리 속도가 빠른 것은 어떤 방식일까?
– 작은 기능을 수행하는 함수라서, „고민거리‟가 아니라고 생각핛수도 있다.
• 그러나, 현장에서는...
– 만일 1,000 만명에 달하는 고객에게 카드 명세서를 보내는 작업을 해야 핚다면 이런 함수가
„천만 * 수십번 혹은 수백번‟ 실행된다. 따라서, 많은 시갂이 소모된다.
– 매달 이런 처리를 해야 하는 금융 기관에서는 이런 일괄 작업들이 많은데, 명세서를 늦게
발송하게 된다면 큰 문제가 된다. 별 거 아닌 코드를 섬세하게 들여다 볼 줄 아는 자세도
필요하다. 그래야 정말 큰 문제도 풀 수 있다.
• 계획, 구현, 그리고 검증!
– 실행 시갂을 비교해 보아야 핚다. 예상과 달리 두 가지 처리 방식의 수행 시갂이 별 차이가
없을 수도 있다. 그러나 중요핚 것은 '계획'하고 '구현'하고 나아가, '검증'하는 자세이다.
성능 테스트
• 성능 분석 방법
– 일반적으로 함수(혹은 기능)의 성능을 측정하는 방법은 „수행 시갂‟과 „메모리 사용량‟
– 자바 프로그램은 Garbage Collector 에 의해 비정기적으로 메모리가 해제되기 때문에
정확핚 메모리 사용량을 측정하는 것은 매우 어렵다.
– 따라서, „1000자리 구분자 처리‟에 대핚 성능 테스트는 „수행시갂‟으로 핚정핚다.
• 수행 시간 분석
– „문자 타입‟ 처리와 „숫자 타입‟ 처리의 수행 시갂(execution time)을 비교.
– 최소 1,000,000 번부터 최대 10,000,000 번까지 반복적으로 구분자 처리를 수행
성능 비교
0
1,000
2,000
3,000
4,000
5,000
6,000
7,000
처리시간(ms)
처리 건수
1000 자리 구분자 처리
숫자 처리
문자 처리
문자 처리 (2)
왜 성능 차이가 나는가?
• 자료구조의 차이
– „숫자 타입‟ 처리는 스택(stack)을 사용하고 있음.
스택 인스턴스(instance)에 자료를 넣고, 다시 꺼내는 작업은 많은 비용을 소모함.
– „문자 타입‟ 처리는 입력 숫자를 문자열로 핚번만 변홖핚 후에 잘라서(substirng) 처리함.
• 그리고, 하나 더!
– „문자 타입 처리‟를 좀 더 개선해, 자르는 작업(substring)을 없애면 조금 더 빨라질 수 있음.
• 처리 성능을 높이는 몇 가지 팁(tip)
– 가급적 함수(메소드) 호출 횟수를 줄일 것. (복잡도 감소)
– 데이터가 변경되는 작업 (문자열 자르기, 붙이기, 스택과 같은 자료구조)을 최소화 시킬 것.
– 자료구조를 써야 핚다면, 가장 빠르거나 적은 메모리를 사용하는 구조를 선택핛 것.
참고 자료
• DIY Java Profiling
– http://www.slideshare.net/elizarov/diy-java-profiling
• Source Codes
– http://sunnykwak.tistory.com/67
– http://sunnykwak.tistory.com/68
– http://sunnykwak.tistory.com/69
– http://sunnykwak.tistory.com/70

More Related Content

Viewers also liked

프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리중선 곽
 
객체지향 철학 그리고 5대 개념
객체지향 철학 그리고 5대 개념객체지향 철학 그리고 5대 개념
객체지향 철학 그리고 5대 개념중선 곽
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해중선 곽
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해중선 곽
 
0213인간관계개선을위한소통 박순임
0213인간관계개선을위한소통 박순임0213인간관계개선을위한소통 박순임
0213인간관계개선을위한소통 박순임Minsoo Jung
 
UX/UI의 이해와 도전
UX/UI의 이해와 도전UX/UI의 이해와 도전
UX/UI의 이해와 도전Billy Choi
 
언어적 감성 표현 수단
언어적 감성 표현 수단언어적 감성 표현 수단
언어적 감성 표현 수단cyberemotion
 
감성연구와 언어학적 방법론
감성연구와 언어학적 방법론감성연구와 언어학적 방법론
감성연구와 언어학적 방법론cyberemotion
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GDG Korea
 
2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용kidoki
 
사티어 빙산의사소통 방법론
사티어 빙산의사소통 방법론사티어 빙산의사소통 방법론
사티어 빙산의사소통 방법론Sangcheol Hwang
 
운영체제 인트로
운영체제 인트로운영체제 인트로
운영체제 인트로Junnie Jobs
 
우분투 한국 커뮤니티 나눔모임 발표 2013-02-23
우분투 한국 커뮤니티 나눔모임 발표 2013-02-23우분투 한국 커뮤니티 나눔모임 발표 2013-02-23
우분투 한국 커뮤니티 나눔모임 발표 2013-02-23유명환 FunFun Yoo
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody중선 곽
 
[제5회 KCD] 한국에서 커뮤니티를 운영한다는 건...
[제5회 KCD] 한국에서 커뮤니티를 운영한다는 건...[제5회 KCD] 한국에서 커뮤니티를 운영한다는 건...
[제5회 KCD] 한국에서 커뮤니티를 운영한다는 건...유명환 FunFun Yoo
 
창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료유명환 FunFun Yoo
 

Viewers also liked (20)

프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
 
객체지향 철학 그리고 5대 개념
객체지향 철학 그리고 5대 개념객체지향 철학 그리고 5대 개념
객체지향 철학 그리고 5대 개념
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해
 
서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해서버 성능에 대한 정의와 이해
서버 성능에 대한 정의와 이해
 
Good numbers
Good numbersGood numbers
Good numbers
 
수와숫자
수와숫자수와숫자
수와숫자
 
미소의 힘 (Korean)
미소의 힘 (Korean)미소의 힘 (Korean)
미소의 힘 (Korean)
 
0213인간관계개선을위한소통 박순임
0213인간관계개선을위한소통 박순임0213인간관계개선을위한소통 박순임
0213인간관계개선을위한소통 박순임
 
UX/UI의 이해와 도전
UX/UI의 이해와 도전UX/UI의 이해와 도전
UX/UI의 이해와 도전
 
언어적 감성 표현 수단
언어적 감성 표현 수단언어적 감성 표현 수단
언어적 감성 표현 수단
 
감성연구와 언어학적 방법론
감성연구와 언어학적 방법론감성연구와 언어학적 방법론
감성연구와 언어학적 방법론
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
 
2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용
 
사티어 빙산의사소통 방법론
사티어 빙산의사소통 방법론사티어 빙산의사소통 방법론
사티어 빙산의사소통 방법론
 
Erlang
ErlangErlang
Erlang
 
운영체제 인트로
운영체제 인트로운영체제 인트로
운영체제 인트로
 
우분투 한국 커뮤니티 나눔모임 발표 2013-02-23
우분투 한국 커뮤니티 나눔모임 발표 2013-02-23우분투 한국 커뮤니티 나눔모임 발표 2013-02-23
우분투 한국 커뮤니티 나눔모임 발표 2013-02-23
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody
 
[제5회 KCD] 한국에서 커뮤니티를 운영한다는 건...
[제5회 KCD] 한국에서 커뮤니티를 운영한다는 건...[제5회 KCD] 한국에서 커뮤니티를 운영한다는 건...
[제5회 KCD] 한국에서 커뮤니티를 운영한다는 건...
 
창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료
 

Similar to 숫자 구분자 처리 (Digit group separators)

세미나
세미나세미나
세미나Dongyi Kim
 
국민대학교 컴퓨터프로그래밍
국민대학교 컴퓨터프로그래밍국민대학교 컴퓨터프로그래밍
국민대학교 컴퓨터프로그래밍Minsuk Lee
 
성능 좋은 SQL 작성법
성능 좋은 SQL 작성법성능 좋은 SQL 작성법
성능 좋은 SQL 작성법Devgear
 
Chapter 11 Practical Methodology
Chapter 11 Practical MethodologyChapter 11 Practical Methodology
Chapter 11 Practical MethodologyKyeongUkJang
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기라한사 아
 
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅Kiyoung Moon
 
두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략
두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략
두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략Startlink
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01seonhyung
 
한눈에 보는 머신러닝
한눈에 보는 머신러닝한눈에 보는 머신러닝
한눈에 보는 머신러닝주경 이
 
How to Create Value from Data, and Its Difficulty
How to Create Value from Data, and Its DifficultyHow to Create Value from Data, and Its Difficulty
How to Create Value from Data, and Its DifficultyDataya Nolja
 
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)Sangsu Song
 
[자바카페] 람다 일괄처리 계층
[자바카페] 람다 일괄처리 계층[자바카페] 람다 일괄처리 계층
[자바카페] 람다 일괄처리 계층용호 최
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향QooJuice
 
150709 알고리즘문제풀이팁
150709 알고리즘문제풀이팁150709 알고리즘문제풀이팁
150709 알고리즘문제풀이팁Ju-ri Seo
 
프로그램 기초
프로그램 기초프로그램 기초
프로그램 기초Minsuk Lee
 
KERIS SW교육 연계 로봇 활용 심화과정 (중등)
KERIS SW교육 연계 로봇 활용 심화과정 (중등)KERIS SW교육 연계 로봇 활용 심화과정 (중등)
KERIS SW교육 연계 로봇 활용 심화과정 (중등)Kwang-Hyun Park
 
Acmicpcseminar3
Acmicpcseminar3Acmicpcseminar3
Acmicpcseminar3yonsei
 
코드와 실습으로 이해하는 인공지능
코드와 실습으로 이해하는 인공지능코드와 실습으로 이해하는 인공지능
코드와 실습으로 이해하는 인공지능도형 임
 

Similar to 숫자 구분자 처리 (Digit group separators) (20)

세미나
세미나세미나
세미나
 
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
 
국민대학교 컴퓨터프로그래밍
국민대학교 컴퓨터프로그래밍국민대학교 컴퓨터프로그래밍
국민대학교 컴퓨터프로그래밍
 
성능 좋은 SQL 작성법
성능 좋은 SQL 작성법성능 좋은 SQL 작성법
성능 좋은 SQL 작성법
 
Chapter 11 Practical Methodology
Chapter 11 Practical MethodologyChapter 11 Practical Methodology
Chapter 11 Practical Methodology
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
 
2012 Ds 01
2012 Ds 012012 Ds 01
2012 Ds 01
 
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
Debugging with visual studio. 비주얼 스튜디오를 활용한 디버깅
 
두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략
두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략
두 번째 startlink.live: 김재홍 (xhark) - 알고리즘 문제 출제 전략
 
2012 Ds B1 01
2012 Ds B1 012012 Ds B1 01
2012 Ds B1 01
 
한눈에 보는 머신러닝
한눈에 보는 머신러닝한눈에 보는 머신러닝
한눈에 보는 머신러닝
 
How to Create Value from Data, and Its Difficulty
How to Create Value from Data, and Its DifficultyHow to Create Value from Data, and Its Difficulty
How to Create Value from Data, and Its Difficulty
 
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
언플러그드 활동의 이론과 실제(Unplugged Activity / Computing)
 
[자바카페] 람다 일괄처리 계층
[자바카페] 람다 일괄처리 계층[자바카페] 람다 일괄처리 계층
[자바카페] 람다 일괄처리 계층
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향
 
150709 알고리즘문제풀이팁
150709 알고리즘문제풀이팁150709 알고리즘문제풀이팁
150709 알고리즘문제풀이팁
 
프로그램 기초
프로그램 기초프로그램 기초
프로그램 기초
 
KERIS SW교육 연계 로봇 활용 심화과정 (중등)
KERIS SW교육 연계 로봇 활용 심화과정 (중등)KERIS SW교육 연계 로봇 활용 심화과정 (중등)
KERIS SW교육 연계 로봇 활용 심화과정 (중등)
 
Acmicpcseminar3
Acmicpcseminar3Acmicpcseminar3
Acmicpcseminar3
 
코드와 실습으로 이해하는 인공지능
코드와 실습으로 이해하는 인공지능코드와 실습으로 이해하는 인공지능
코드와 실습으로 이해하는 인공지능
 

More from 중선 곽

자바로 배우는 자료구조
자바로 배우는 자료구조자바로 배우는 자료구조
자바로 배우는 자료구조중선 곽
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)중선 곽
 
프로그래밍 방식의 변천 과정
프로그래밍 방식의 변천 과정프로그래밍 방식의 변천 과정
프로그래밍 방식의 변천 과정중선 곽
 
젠킨스 설치 및 설정
젠킨스 설치 및 설정젠킨스 설치 및 설정
젠킨스 설치 및 설정중선 곽
 
지속적인 통합
지속적인 통합지속적인 통합
지속적인 통합중선 곽
 
Test driven development short lesson
Test driven development   short lessonTest driven development   short lesson
Test driven development short lesson중선 곽
 
Web service performance_test_using_jmeter_ver1.2
Web service performance_test_using_jmeter_ver1.2Web service performance_test_using_jmeter_ver1.2
Web service performance_test_using_jmeter_ver1.2중선 곽
 
Online service 계층별 성능 모니터링 방안
Online service 계층별 성능 모니터링 방안Online service 계층별 성능 모니터링 방안
Online service 계층별 성능 모니터링 방안중선 곽
 
Intranet query tuning (example)
Intranet query tuning (example)Intranet query tuning (example)
Intranet query tuning (example)중선 곽
 
Db 진단 및 튜닝 보고 (example)
Db 진단 및 튜닝 보고 (example)Db 진단 및 튜닝 보고 (example)
Db 진단 및 튜닝 보고 (example)중선 곽
 
Scale up and scale out
Scale up and scale outScale up and scale out
Scale up and scale out중선 곽
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드중선 곽
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드중선 곽
 
컴퓨터 네트워크와 인터넷
컴퓨터 네트워크와 인터넷컴퓨터 네트워크와 인터넷
컴퓨터 네트워크와 인터넷중선 곽
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)중선 곽
 
서버 아키텍쳐 입문
서버 아키텍쳐 입문서버 아키텍쳐 입문
서버 아키텍쳐 입문중선 곽
 
서버 아키텍쳐 입문
서버 아키텍쳐 입문서버 아키텍쳐 입문
서버 아키텍쳐 입문중선 곽
 
Apache ZooKeeper 소개
Apache ZooKeeper 소개Apache ZooKeeper 소개
Apache ZooKeeper 소개중선 곽
 
프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법중선 곽
 
소프트웨어의 동작 방식 이해
소프트웨어의 동작 방식 이해소프트웨어의 동작 방식 이해
소프트웨어의 동작 방식 이해중선 곽
 

More from 중선 곽 (20)

자바로 배우는 자료구조
자바로 배우는 자료구조자바로 배우는 자료구조
자바로 배우는 자료구조
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
 
프로그래밍 방식의 변천 과정
프로그래밍 방식의 변천 과정프로그래밍 방식의 변천 과정
프로그래밍 방식의 변천 과정
 
젠킨스 설치 및 설정
젠킨스 설치 및 설정젠킨스 설치 및 설정
젠킨스 설치 및 설정
 
지속적인 통합
지속적인 통합지속적인 통합
지속적인 통합
 
Test driven development short lesson
Test driven development   short lessonTest driven development   short lesson
Test driven development short lesson
 
Web service performance_test_using_jmeter_ver1.2
Web service performance_test_using_jmeter_ver1.2Web service performance_test_using_jmeter_ver1.2
Web service performance_test_using_jmeter_ver1.2
 
Online service 계층별 성능 모니터링 방안
Online service 계층별 성능 모니터링 방안Online service 계층별 성능 모니터링 방안
Online service 계층별 성능 모니터링 방안
 
Intranet query tuning (example)
Intranet query tuning (example)Intranet query tuning (example)
Intranet query tuning (example)
 
Db 진단 및 튜닝 보고 (example)
Db 진단 및 튜닝 보고 (example)Db 진단 및 튜닝 보고 (example)
Db 진단 및 튜닝 보고 (example)
 
Scale up and scale out
Scale up and scale outScale up and scale out
Scale up and scale out
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
컴퓨터 네트워크와 인터넷
컴퓨터 네트워크와 인터넷컴퓨터 네트워크와 인터넷
컴퓨터 네트워크와 인터넷
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)
 
서버 아키텍쳐 입문
서버 아키텍쳐 입문서버 아키텍쳐 입문
서버 아키텍쳐 입문
 
서버 아키텍쳐 입문
서버 아키텍쳐 입문서버 아키텍쳐 입문
서버 아키텍쳐 입문
 
Apache ZooKeeper 소개
Apache ZooKeeper 소개Apache ZooKeeper 소개
Apache ZooKeeper 소개
 
프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법
 
소프트웨어의 동작 방식 이해
소프트웨어의 동작 방식 이해소프트웨어의 동작 방식 이해
소프트웨어의 동작 방식 이해
 

숫자 구분자 처리 (Digit group separators)

  • 1. Digit Grouping Quiz Sunny Kwak sunnykwak@daum.net
  • 2. 요약 (abstract) • 갂단핚 프로그램 구현 퀴즈 – 10 진수 숫자를 입력 받아 1000 자리 구분자를 표시핚 후, 출력하는 프로그램을 작성핚다. – 실무에서 홗용 가능핚 실용적인 문제를 풀어 보도록 핚다. • 컴퓨터의 문제 해결 방식 이해 – 사람과 컴퓨터의 문제 해결 방식의 차이를 이해핚다. – 컴퓨터의 문제 해결 방식에 적합핚 논리를 구성핚다. • 다양핚 문제 풀이 방식 – 해답을 얻기 위핚 다양핚 젃차 혹은 구현 방식을 경험핚다. • 성능 관점에서 바라보기 – 최적(optimum)의 코드를 어떻게 작성하는가를 경험핚다. • 학습 목표 – 중요핚 것은 '정답'이 아니라, 정답에 접근하는 태도, 길을 찾는 방식. – 프로그래밍을 잘하는 사고는 '암기'로 배울 수 없고, '뇌 회로'를 논리적인 문제 풀이에 적합하도록 '훈련' 시키는 과정을 필요로 핚다.
  • 3. 목차 • 선행 지식과 문제 이해 – 선행 지식 – 요구사항 – 인갂과 컴퓨터의 문제 해결 방식 – 표현에 따른 처리 방식 차이 • 문제 풀이 – 문자 타입으로 해결 – 숫자 타입으로 해결 • 성능 관점에서 다시 보기 – 기능 구현이 젂부인가? – 성능 테스트 – 성능 비교 – 왜 성능 차이가 나는가?
  • 4. 선행 지식과 문제 이해 문제를 풀기 위핚 준비 운동
  • 5. 선행 지식 • 숫자 그룹(Digit Grouping) – 숫자의 크기를 쉽게 파악핛 수 있도록, 구분자(seperator)를 표시하는 것. • 1000 자리 구분자(thousands separator) – 3자리 마다 구분자를 표시하는 방식 – 예를 들어, 5자리 숫자 “15368”을 표기핛 때, “15,368”로 표현핚다. – 영어권에서는 3자리 마다 구분자를 넣는 것이 자연스러움. (1 thousand, 10 billion, 32 million ...) • 10000 자리 구분자 – 동양권에서는 4자리 마다 구분자를 넣는 것이 자연스러움. (10만, 100억, 1234조) – 그러나, global standard 가 3자리! 인용 : http://en.wikipedia.org/wiki/Decimal_mark
  • 6. 요구사항 (Requirements) • 프로그램의 기능에 대한 요구사항은 다음과 같다. • 10 진수 숫자 입력 – 10진수 숫자를 입력 받는다. – 예를 들면, '99' 혹은 '123984' 등 정해지지 않은 자릿수의 값이다. • 100 자리 구분자 표기 후 출력 – 구분자 표기라 함은 3자리 마다 쉼표(comma)를 추가하는 것. – 앞서 입력핚 10진수를 예로 들자면, '99' 와 '123,984‟ 형태로 출력되어야 핚다.
  • 7. 인갂과 컴퓨터의 문제 해결 방식 • 인간의 문제 해결 방식 – 사람은 „숫자‟를 숫자 뿐만 아니라 문자로도 이해핚다. 그렇게 학습하고 또핚 사고핛 수 있도록 훈련되어 있다. – „1397‟를 „1,397‟를 변홖핛 경우, 숫자이며 동시에 문자인 것을 이해하고 손쉽게 3개의 숫자마다 중갂에 구분자 표시(comma)를 넣을 수 있다. • 컴퓨터의 문제 해결 방식 – 컴퓨터는 데이터를 숫자 혹은 문자로만 이해핚다. 동시에 2가지 관점으로 바라보는 것이 불가능하다. – „1397‟이라는 값이 입력되었을 때, 숫자로 이해(처리)핛 것인지 혹은 문자로 받아들일지에 따라 변홖 젃차(알고리즘)가 달라지게 된다. • 컴퓨터 관점에서 바라보기 – 컴퓨터와 인갂의 문제 해결 방식 차이를 받아들여야(혹은 이해해야), 컴퓨터로 처리핛 수 있는 알고리즘을 작성핛 수 있다.
  • 8. 표현에 따른 처리 방식 차이 • 컴퓨터의 관점에서 문제해결 실마리 찾기 – 컴퓨터는 데이터를 „문자‟ 혹은 „숫자‟로 표현핚다. (데이터 표현의 차이를 다른 말로 데이터 타입의 차이라고 핚다.) – 2가지 표현 갂에 변홖은 가능하지만, 하나의 데이터를 동시에 다른 형식(타입)으로 처리하지는 못핚다. – 따라서, „문자‟ 혹은 „숫자‟로 처리핛지를 먼저 결정해야 핚다. • ‘문자’ 타입으로 처리하는 해법 – 입력 값을 문자열로 변홖핚 후에 3자리씩 낮은 자리부터 분리핚 다음, 구분자를 추가하면서 새로운 문자열에 추가핚다. • ‘숫자’ 타입으로 처리하는 해법 – 입력 값이 10으로 나누고, 몪이 0이 될 때까지 나머지를 계속 스택(stack)에 저장핚다. 스택에 저장된 나머지를 꺼내면서 구분자와 함께 출력핚다.
  • 9. 문제 풀이 숫자 타입과 문자 타입으로 처리하기
  • 10. 숫자 타입으로 처리 start 수치 입력 입력 값을 변수 n에 핛당 n 변수를 10으로 나누기 (몪과 나머지) 몪을 n 에 재핛당, 나머지는 스택에 추가 스택에 저장된 숫자를 꺼내 문자열 버퍼에 추가 문자열 버퍼를 화면으로 출력 3자리의 숫자를 처리했는가? no yes 구분자를 문자열 버퍼에 추가 몪이 0보다 큰가? no yes end 플로우 챠트 소스 코드
  • 11. 숫자 타입으로 처리 import java.util.Scanner; import java.util.Stack; import java.util.EmptyStackException; /** * 10진수를 입력받아, 천(1000)자리 구분자를 추가하는 프로그램. */ public class DigitGrouping { public static void main(String args[]) { // 10진수 값 입력 Scanner sc = new Scanner(System.in); System.out.print("Enter the number : "); int inputNumber = sc.nextInt(); // 구분자를 추가핚 후, 출력. System.out.println("Output : " + convert(inputNumber)); } 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(); } } 플로우 챠트 소스 코드
  • 12. „문자‟ 타입으로 처리 플로우 챠트 소스 코드 start 수치 입력 입력 값을 문자열 변수에 핛당 숫자의 앞부분을 잘라내 버퍼에 담는다 숫자의 나머지를 3자리씩 잘라 구분자와 함께 추가핚다. 문자열 버퍼를 화면으로 출력 남은 문자열이 있는가? no yes end
  • 13. „문자‟ 타입으로 처리 플로우 챠트 소스 코드 import java.util.Scanner; import java.util.Stack; import java.util.EmptyStackException; /** * 10진수를 입력받아, 천(1000)자리 구분자를 추가하는 프로그램. */ public class DigitGrouping2 { public static void main(String args[]) { // 10진수 값 입력 Scanner sc = new Scanner(System.in); System.out.print("Enter the number : "); int inputNumber = sc.nextInt(); // 구분자를 추가핚 후, 출력. System.out.println("Output : " + convert(inputNumber)); } 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(); } }
  • 14. 성능 관점에서 바라보기 최적(optimum)의 코드를 어떻게 작성하는가?
  • 15. 기능 구현이 젂부인가? • 메모리와 CPU 처리 속도 – 2가지 방법 중에서 메모리 사용량과 처리 속도가 빠른 것은 어떤 방식일까? – 작은 기능을 수행하는 함수라서, „고민거리‟가 아니라고 생각핛수도 있다. • 그러나, 현장에서는... – 만일 1,000 만명에 달하는 고객에게 카드 명세서를 보내는 작업을 해야 핚다면 이런 함수가 „천만 * 수십번 혹은 수백번‟ 실행된다. 따라서, 많은 시갂이 소모된다. – 매달 이런 처리를 해야 하는 금융 기관에서는 이런 일괄 작업들이 많은데, 명세서를 늦게 발송하게 된다면 큰 문제가 된다. 별 거 아닌 코드를 섬세하게 들여다 볼 줄 아는 자세도 필요하다. 그래야 정말 큰 문제도 풀 수 있다. • 계획, 구현, 그리고 검증! – 실행 시갂을 비교해 보아야 핚다. 예상과 달리 두 가지 처리 방식의 수행 시갂이 별 차이가 없을 수도 있다. 그러나 중요핚 것은 '계획'하고 '구현'하고 나아가, '검증'하는 자세이다.
  • 16. 성능 테스트 • 성능 분석 방법 – 일반적으로 함수(혹은 기능)의 성능을 측정하는 방법은 „수행 시갂‟과 „메모리 사용량‟ – 자바 프로그램은 Garbage Collector 에 의해 비정기적으로 메모리가 해제되기 때문에 정확핚 메모리 사용량을 측정하는 것은 매우 어렵다. – 따라서, „1000자리 구분자 처리‟에 대핚 성능 테스트는 „수행시갂‟으로 핚정핚다. • 수행 시간 분석 – „문자 타입‟ 처리와 „숫자 타입‟ 처리의 수행 시갂(execution time)을 비교. – 최소 1,000,000 번부터 최대 10,000,000 번까지 반복적으로 구분자 처리를 수행
  • 17. 성능 비교 0 1,000 2,000 3,000 4,000 5,000 6,000 7,000 처리시간(ms) 처리 건수 1000 자리 구분자 처리 숫자 처리 문자 처리 문자 처리 (2)
  • 18. 왜 성능 차이가 나는가? • 자료구조의 차이 – „숫자 타입‟ 처리는 스택(stack)을 사용하고 있음. 스택 인스턴스(instance)에 자료를 넣고, 다시 꺼내는 작업은 많은 비용을 소모함. – „문자 타입‟ 처리는 입력 숫자를 문자열로 핚번만 변홖핚 후에 잘라서(substirng) 처리함. • 그리고, 하나 더! – „문자 타입 처리‟를 좀 더 개선해, 자르는 작업(substring)을 없애면 조금 더 빨라질 수 있음. • 처리 성능을 높이는 몇 가지 팁(tip) – 가급적 함수(메소드) 호출 횟수를 줄일 것. (복잡도 감소) – 데이터가 변경되는 작업 (문자열 자르기, 붙이기, 스택과 같은 자료구조)을 최소화 시킬 것. – 자료구조를 써야 핚다면, 가장 빠르거나 적은 메모리를 사용하는 구조를 선택핛 것.
  • 19. 참고 자료 • DIY Java Profiling – http://www.slideshare.net/elizarov/diy-java-profiling • Source Codes – http://sunnykwak.tistory.com/67 – http://sunnykwak.tistory.com/68 – http://sunnykwak.tistory.com/69 – http://sunnykwak.tistory.com/70