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

문제

사용자 삽입 이미지

코드

#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 카켈




1. 목적

  - 문자열에 대한 추가적인 이해를 한다.

2. 문제 (점수 : 25 점)
  - 문자열을 입력받아 처음에는 대문자로 변환하고 다음에는 크기 순으로 내림차순 정렬하여 출력하여라.
  - 출력 화면

문자열을 입력하세요 : Here I Stand For You !!
입력된 문자열 : Here I Stand For You !!
변환된 문자열 : HERE I STAND FOR YOU !!
정렬된 문자열 : YUTSRROONIHFEEDA!!
Press any key to continue


3. 이해
  - 문자열과 각 문자의 특성을 이해하는가?
  - 내림차순에 대한 정렬의 개념을 아는가?

4. 코드

#include <stdio.h>
#include <ctype.h>

int main()
{
 char in[255] = {0};
 char out[255] = {0};
 char swap;
 int i, j, length;
 i = j = length = 0;
 
 printf("문자열을 입력하세요 : ");
 gets(in);
 printf("입력된 문자열 : ");puts(in);
 printf("변환된 문자열 : ");while(in[length] != 0)
 {
  putchar(toupper(in[length]));
  length++;
 
 }

 i = 0;
 j = 0;

 while(in[i] != 0)
 {
  if( !(isspace(in[i])) )
  {
   out[j] = toupper(in[i]);
   j++;

  }

  i++;

 }

 printf("\n정렬된 문자열 : ");
 for(i = 0; i < length; i++)
 {
  for(j = i; j < length; j++)
  {
   if(out[i] < out[j])
   {
    swap = out[i];
    out[i] = out[j];
    out[j] = swap;

   }

  }
 }

 puts(out);

 return 0;
}


5. 해설
  - 이전 문제에서 띄워 쓰기를 없애는 기능을 추가했습니다. isspace 함수가 띄워쓰기(엔터/탭/스페이스) 값을 구별하는 역할을 합니다.
  - 내림차순은 큰 값에서 작은 값으로 내려가는 의미로 쓰입니다. 당연히 작은값 - 큰값으로 되어 있다면 그 위치를 바꿔줌으로써 정렬을 완성 시킵니다.

6. 참고
  - 유사 문제
Posted by 카켈
이전페이지 1 다음페이지