목적
- 문자열에서 사전정렬을 이해한다.
문제
코드
#include <cstring>
#include <ctype.h>
using namespace std;
int main(void)
{
char sIn[4][255] = {0};
char sSwap[255] = {0};
char cBuf = ' ';
long lSwap = 0;
long lValue[4] = {0};
int i, j;
i = j = 0;
while(i < 4)
{
cout << i + 1 << "번째 문자열 입력 : ";
cin.getline(sIn[i],255);
while(cBuf != 0)
{
cBuf = sIn[i][j];
if(cBuf != ' ')
{
if(islower(cBuf))
{
lValue[i] = (int)cBuf - 60;
break;
}
if(isupper(cBuf))
{
lValue[i] = (int)cBuf - 55;
break;
}
if(isdigit(cBuf))
{
lValue[i] = (int)cBuf - 48;
break;
}
}
j++;
}
cBuf = ' ';
j = 0;
i++;
}
i = 0;
j = 0;
while(i < 4)
{
j = i;
while(j < 4)
{
if(lValue[i] < lValue[j])
{
lSwap = lValue[j];
lValue[j] = lValue[i];
lValue[i] = lSwap;
strcpy(sSwap, sIn[i]);
strcpy(sIn[i], sIn[j]);
strcpy(sIn[j], sSwap);
}
j++;
}
i++;
}
i = 0;
cout << endl << "크기순으로 정렬된 문자열 : " << endl;
while(i<4)
{
cout << sIn[i] << endl;
i++;
}
return 0;
}
해설
- 코드가 약간 비효율적입니다.
- 문제를 제대로 이해하시면 상당히 쉽습니다. 사전정렬을 하되 소문자 > 대문자 > 숫자 그룹별로 숫자가 크며, 사전순으로 알파벳 순서가지날수록 값이 커집니다. 이 숫자를 각 문자열의 첫째 글자만 맞춰서 문자열을 내림차순으로 맞춥니다.
- 문제를 이해하지 못해서 값을 더하면 엉뚱한 결과가 나옵니다.
- 예제에서 'V' > 'M' > 'I' > 'H' 이라서 순서가 실행결과 처럼 나왔습니다.
- 첫째 글자가 검출되면 계산후 값을 저장하고 break로 탈출합니다.
참고
- 해답에는 vector 알고리듬을 쓰던데 크게 차이는 없습니다.
- 유사 문제 검색