Programming/C

[백준] 단계별로 풀어보기 > 함수 (C언어)

코딩뽀시래기 2021. 8. 19. 17:10
728x90

+) 풀이 코드

https://github.com/jung0115/CodingTestPractice.git

 

GitHub - jung0115/CodingTestPractice: Practice Coding Test with Beakjoon, programmers, etc.

Practice Coding Test with Beakjoon, programmers, etc. - GitHub - jung0115/CodingTestPractice: Practice Coding Test with Beakjoon, programmers, etc.

github.com

 

15596번 - 2021.08.19.목

#include <stdio.h>
long long sum(int *a, int n){
  int i;
  long long result=0;

  for(i=0; i<n; i++)
    result += a[i];
  
  return result;
}

처음에 main 함수까지 다 작성했는데 계속 오류가 났다. 찾아보니 sum 함수만 구현을 해서 제출하면 되는 거였다... 그래서 sum만 구현해서 제출했는뎆 또 컴파일 오류가 났다. 지금까지 C언어로 구현을 하면서 제출 언어를 C++17로 했는데 문제가 없기에 그렇게 했는데 이번에는 함수만 제출하는 거라 그런지 문제가 있었다. 그래서 C11로 바꾸어 제출을 했더니 정상적으로 동작했다.

 

4673번 - 2021.08.17.화(time limited)

#include <stdio.h>

int correct(int Num);
int cal(int start, int finish);
int main(void){
  int i, correctResult;

  for(i=1; i<=10000; i++){
    correctResult=correct(i);
    if(correctResult==1)
      printf("%d\n", i);
  }

  return 0;
 }
int correct(int Num){
  int i, result;
  for(i=1; i<Num; i++){
    result = cal(i, Num);
    if(result == 1)
      return 0;
  }
  return 1;
}
int cal(int start, int finish){
  int sumNumber;
  while(start<finish){
    sumNumber=start;
    while(sumNumber!=0){
      start+=sumNumber%10;
      sumNumber/=10;
    }
    if(start==finish)
      return 1;
  }
  return 0;
}

처음 선택한 방식은 셀프 넘버를 구하기 위해 1부터 10000까지의 수를 for문으로 반복시키고, 각 수마다 자신보다 작은 수 중 자신의 생성자가 있는지를 파악하는 구조로 구현하였다. 이 코드는 원하는 답을 얻을 수는 있지만 각 숫자별로 자신의 생성자를 찾아야 하는 것이기 때문에 시간이 오래 걸린다는 문제가 발생한다.

 

4673번 - 2021.08.19.목(해결)

#include <stdio.h>

int numCal(int num);//생성자가 입력되면 계산해서 다음 수열을 출력으로 내보냄
int main(void){
  int i, funcResult, notSelfNumber[10001]={0};

  for(i=1; i<=10000; i++){
    funcResult=numCal(i);
    if(funcResult<=10000) //생성자가 있는 수, 즉 셀프 넘버가 아닌 수
      notSelfNumber[funcResult]=1;
  }

  for(i=1; i<=10000; i++){
    if(notSelfNumber[i]==0){ //생성자가 없는 수, 즉 셀프 넘버
      printf("%d\n", i);
    }
  }

  return 0;
}
int numCal(int num){
  int sum=num;

  while(num>0){
    sum+=num%10;
    num/=10;
  }

  return sum;
}

time limited가 걸렸던 풀이와 다른 방법으로, 1부터 10000까지를 모두 생성자로 하여 계산한 결과값에 표시(배열의 해당 인덱스에 1을 할당)를 해두는 방법을 이용했다. 시간 초과를 해결하는 방법이 생각나지 않아 검색하여 알아낸 방법인데, 우선 1부터 10000까지의 수 중 생성자가 있는 수를 모두 찾아내어 나머지 수를 출력하는 방법이다. 이 방법이 앞선 방법보다 훨씬 시간을 절약해준다.

 

1065번 - 2021.08.19.목

#include <stdio.h>

void HanSuCheck(int N, int *HanSu); //한수 체크
int main(void){
  int HanSu[1001]={0}, N, i, cnt=0;

  scanf("%d", &N);

  HanSuCheck(N, HanSu);

  for(i=1; i<=N; i++){
    if(HanSu[i]==1)
      cnt++;
  }

  printf("%d", cnt);

  return 0;
}
void HanSuCheck(int N, int *HanSu){
  int i, num[3];
  for(i=1; (i<100)&&(i<=N); i++) //한 자리 수와 두 자리 수는 모두 한수
    HanSu[i]=1;
  
  for(i=100; i<=N; i++) { //세 자리 수 확인 + 1000은 한수가 아니므로 계산 X
    num[0]=i%10; //셋째자리
    num[1]=(i/10)%10; //둘째자리
    num[2]=i/100; //첫째자리
    if((num[0]-num[1])==(num[1]-num[2]))
      HanSu[i]=1;
  }
}

 

728x90