명품 C++ 프로그래밍 2장 14번 문제는 아래와 같다.


14. 영문 텍스트를 입력받아 알파벳 히스토그램을 그리는 프로그램을 작성하라. 대문자는 모두 소문자로 집계하며, 텍스트 입력의 끝은 ';' 문자로 한다.

영문 텍스트를 입력하세요. 히스토그램을 그립니다.

텍스트의 끝은 ; 입니다. 10000개까지 가능합니다.

Wise men say, only fools rush in

But I can't help. falling in love with you


Shall I stay? Would it be a sin?

If I can't help. falling in love with you


Like a river flows. surely to the sea

Darling so it goes, some things aren't meant to be ; <- ; 뒤 <Enter> 키

총 알파벳 수 179


a(13)    : *************

b(3)     : ***

c(2)     : **

d(2)     : **

e(17)    : *****************

f(5)     : *****

g(5)     : *****

h(8)     : ********

i(19)    : *******************

j(0)     :

k(1)     : *

l(17)    : *****************

m(3)     : ***

n(14)    : **************

o(14)    : **************

p(2)     : **

q(0)     :

r(6)     : ******

s(14)    : **************

t(14)    : **************

u(6)     : ******

v(3)     : ***

w(5)     : *****

x(0)     :

y(6)     : ******

z(0)     :

계속하려면 아무 키나 누르십시오 . . .


먼저 이런 형식의 문제는 cin.getline() 함수를 사용하여 풀어야 하는 문제이다.


getline 함수를 사용한 후 문장 속 알파벳과 그 외 문자들을 구분하고 알파벳 중 대문자, 소문자를 구분하여야 한다.


문제 풀이의 전 과정도 알고 싶다면 아래 더보기를 누르기 바란다.



그러면 이제 제목에서 언급한 배열 Value를 배열 Index로 사용하는 방법을 말해보고자 한다.

문제 중 알파벳 소문자 입력 갯수를 세는 방법은 물론 많겠지만 나는 배열을 이용해보고자 한다.

내가 배열을 사용하는 이유를 간단하게 설명하자면

만약 a가 나오면 배열[0] 값을 +1을 시켜주고 b가 나오면 배열[1] 값을 +1 시켜주는 메커니즘을 사용할 거다.

int형 변수를 26개 만들어서 넣어도 되는데 굳이 이럴 필요 있나? 이러려고 배운게 배열인데.


만드는 방법은 이러하다.  

int형 배열 alpha를 만들어 알파벳 소문자 갯수인 26만큼의 공간을 만들어 준다.

그리고 해당 배열을 모두 0으로 초기화 해준다.

간단하게 int alpha[26] = {0} 이라고 적으면 배열 선언과 동시에 배열 내 모든 값들이 0으로 초기화된다.


이게 글로만 적어버리면 설명하기도 힘들고 이해하기도 힘드니 소스 먼저 보여주고 설명토록 하겠다.

for (int i = 0; i < len; i++)

{

if (isalpha(text[i]) == 2)

{

alpha[tolower(text[i]) - 97]++;

}

}


len 변수는 orig_text 문자열 길이의 값이다. (현재 orig_text 변수와 text 변수의 문자열 길이는 일치하기 때문에 따로 재지정하진 않았다.)


굵게 처리된 부분이 핵심이다.

다른 부분들은 쉽게 이해 할거라 믿고 핵심 부분만 설명하겠다.

97은 알파벳 소문자 'a'의 ASCII Code이다. ('A' 아니다.)


위에 설명 했다시피 tolower 함수는 정수를 반환시킨다.

그럼 text[0] 값이 a라고 가정하여 풀어서 설명하겠다.

① alpha[tolower(text[0]) - 97] ++;


② alpha[tolower('a') - 97] ++;


③ alpha[97 - 97] ++;


④ alpha[0] ++;

보시다시피 a 값이 나오면 alpha[0] 배열을 1 증가 시키는 메커니즘이 된다.

그럼 z를 넣는다면 어떻게 될까?

① alpha[tolower(text[0]) - 97] ++;


② alpha[tolower('z') - 97] ++;


③ alpha[122 - 97] ++;


④ alpha[25] ++;

딱 배열의 끝인 alpha[25]까지 값이 대입된다.


문제 특성상 ASCII Code를 이용한 배열이기 때문에 순수하게 배열 Value로만 index로 사용하진 않았지만, 이런 식으로 추가적으로 배열 Value을 셈하여 Index로 사용할 수 있다.


글을 쓰다보니 문제 전체적인 해설을 하게 되었는데... 설명해주고 싶은게 많았다보다.

+ Recent posts