본문 바로가기
IT/자료구조 및 알고리즘

C 언어 <배열과 포인터> 관련 알고리즘 문제

by 세계 최고의 AI Engineer_naknak 2023. 2. 3.

알고리즘과 함께하는 C의 아름다움에 수록된 문제입니다.

 

Q. 2부터 100까지의 숫자 중에서 소수만을 골라서 배열에 저장하세요

 

#include <stdio.h>

int main() {

// bool을 사용하고 싶었지만 컴파일러 문제로 bool에 오류가 떠서 isSosu를 통해서 소수인지 아닌지를
// 구분했습니다.
  int cnt = 0;
  int isSosu = 1;
  int pNs[25];

// 2 ~ 100까지의 값입니다.
  for (int i = 2; i < 101; i++)
  {
    isSosu = 1;
    // 소수란 1과 자신 외에 나눠지는 수가 없다는 뜻이기 때문에
    for (int j = 2; j < i; j++)
    {
    // 자신 외에 나머지가 0일때 (나누어졌다는 뜻) isSosu에 0을 넣어서 flag 동작을 할 수 있도록 했습니다.
      if ((i % j) == 0)
      {
        isSosu = 0;
        break;
      }
    }
    // 그래서 isSosu가 1인 경우는 1과 자신 외에 나눠지는 숫자가 없다는 뜻이기 때문에 배열에 추가하도록 했습니다.
    if (isSosu == 1)
    {
    // cnt는 소수인 경우에만 증가하며 배열에 담길 소수의 위치를 의미합니다.
      pNs[cnt] = i;
      cnt++;
    }
  }

  for (int i = 0; i < sizeof(pNs)/sizeof(int); i++)
  {
    printf("%d ", pNs[i]);  
    
  }


	return 0;
}

 

 

Q. 정수 N에 포함된 숫자들을 재구성해서 만들 수 있는 가장 큰 숫자는 얼마입니까?

 

정수 : 192837465

출력 : 987654321

 

본인 풀이 : 이 문제를 풀기 위해 다음과 같이 생각했습니다

0. 정수를 입력 받는다(생략했습니다)

1. 정수를 배열에 담는다

2. 내부 비교를 통해서 정렬을 한다

3. 다시 정수로 변환한다.

 

#include <stdio.h>
#include <math.h>

int main(){

      int N = 192837465;
      int pNs[9];
      int sum = 0, i = 0, tmp = 0;
		
      // 정수를 배열에 담는 작업입니다.
      // 1. 1의 자리부터 끝까지 배열에 담아줍니다.
      // 그리고 i에는 N의 자릿수가 저장됩니다.
      for ( i = 0; N > 0 ; i++)
      {
        pNs[i] = N % 10;
        N = N/10;
      }

	// 2. 내부에서 정렬을 해줍니다. 내림차순으로 정렬을 해주었습니다.
      for (int j = 0; j < i; j++)
      {
        for (int k = j+1; k < i; k++)
        {
          if (pNs[j] <= pNs[k])
          {
            tmp = pNs[j];
            pNs[j] = pNs[k];
            pNs[k] = tmp;
          }
        }
      }

      
      //  3. 배열을 다시 정수로 변환해줍니다.
      for (int l = 0; l < sizeof(pNs)/sizeof(int); l++)
      {
        printf("제곱값 : %d\n", pNs[l]);
        sum = sum + (pNs[l] * (int) pow(10.0, i-l));
      }


      printf("%d", sum);


      return 0;
  }

배열을 다시 정수로 변환하기 위해 여러가지 방법을 썼습니다.

사실 위와 같이 3번을 실행하면 이상한 숫자가 나옵니다. 아직도 왜 그런지는 알 수가 없습니다...

분명 9가 나와야하는데 겁나 큰 숫자가 나와서 저를 곤란하게 하고 있습니다.

해설은 3번을 atoi 함수를 사용해서 해결합니다. atoi 함수는 문자열을 정수로 변환하는 함수라고 합니다.

#include <stdlib.h> // atoi() 함수를 쓰기 위한 구문

nMax = atoi(pNs);

...네 끝입니다.

....하하 ㅋㅋㅋㅋㅋ

댓글