목적
  - 문자열에서 사전정렬을 이해한다.

문제

사용자 삽입 이미지

코드

#include <iostream>
#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 알고리듬을 쓰던데 크게 차이는 없습니다.
  - 유사 문제 검색

Posted by 카켈