ACM 문제 중 하나. WERTYU를 풀어보았다.
Description
A common typing error is to place the hands on the keyboard one row to the right of the correct position. So "Q" is typed as "W" and "J" is typed as "K" and so on. You are to decode a message typed in this manner.
Input
Output
Sample Input
O S, GOMR YPFSU/
Sample Output
I AM FINE TODAY.
[ |
] |
\ |
; |
' |
, |
. |
/ |
` |
- |
P |
[ |
] |
L |
; |
M |
, |
. |
0 |
- |
위의 표와 같은 구성이다. 즉 '[ ' 키가 오면 아래 'P'값으로 출력해주면된다.
alpha,num배열 또한 같은 구성이다. 이 배열들은 위의 문자와 같은 비교를 해줄 필요가 없다.
입력받은 값으로 index계산이 가능하므로 비교하기 위해 2차원 배열을 만들 필요는 없다.
배열의 구성은 위 표와 같이 'B' 라는 값이 오면 'V'를 출력하면 된다.
이제 이 배열들을 어떻게 이용할까.
string sentence; // 문장을 입력받는다.
getline(cin, sentence);
우선 가장 먼저 해야 할건 입력을 받는 일이다. 이는 위의 getline함수로 받는다.
후에 string으로 받은 문자열을 c 스타일로 고쳐주어야 한다. 그 이유는 string의 경우 sentence[0] = "a"; 로 값을 바꿀수없다.
기본적으로 제공하는 string class의 함수중에 replace라는 함수가 있지만 다른 방법을 이용했다.
※물론 처음부터 char* sentence; 로 만들고 gets()함수로 받아도 상관은 없다.
string 문자열은 기본적으론 c++에서 제공하는 class다. 우선 이를 C style인 char*형으로 고쳐주어야한다.
다행이도 이걸 제공해주는 기본 함수가 있다. c_str()함수다. sentence.c_str()을 하면 C style로 바뀐다.
그러나 또 문제가 있다. 이렇게 변환해서 보니 string이 const char*이다. 아마 내 블로그에 올린 글을 열심히 본 사람이라면 쉽게 해법을 찾겠지만 보통은 잘 모르는 경우가 많다. C++에서는 여러가지 형변환이 존재한다. 이 내용은 C++내용에 있으므로 생략.
여하튼 const를 떼는 방법은 const_cast를 사용하면된다.
const_cast<char*>(sentence.c_str());
과 같이 할 경우 sentence를 char*형과 같이 사용 할 수 있다.
이제 문제는 거의 다 푼 거나 마찬가지다.
아, 한가지 문제점이 더 남았다. 어떻게 문자를 알파벳과, 숫자, 그외문제로 구분 할 것인가. "전부 비교해야하는거 아닌가?" 의문이 들겠지만, 기본적으로 제공해 주는 함수가 있다. isalpha(), isdigit()과 같은 함수들이다. 이는 기본적으로 있는 표준함수들이다.
for(int i = 0; i < sentence.length(); i++) {
if(isalpha(sentence[i])) {
sentence[i] = alpha[sentence[i]-'A'];
}//end of if
else if(isdigit(sentence[i])) {
sentence[i] = num[sentence[i]-'0'];
}//end of else if
else {
for(int j = 0; j < 11; j++) {
if(sWords[0][j] == sentence[i]){
sentence[i] = sWords[1][j];
break;
}//end of if
}//end of for(int j)
}//end of else
}//end of for(int i)
와 같이 바꿔 주어야한다. 포인트는 while문을 탈출하기 위해 반드시 어떤 조건으로 탈출시켜야 하는 것이다. 아니면 time limit이 걸린다.
결과는 위와 같다. 잘된다.
'P > C++' 카테고리의 다른 글
Graphical Editor (0) | 2014.07.05 |
---|---|
The Trip (2) | 2014.06.27 |
링크드리스트로 하드디스크 흉내내기. (0) | 2012.11.13 |
Calling (0) | 2012.10.01 |
strlen(), strcpy() 구현 (0) | 2012.08.29 |