티스토리 뷰

 

 

 

문제

자연수의 각 자릿수 중에서 소수는 몇 개인지 구하려 합니다.

즉, 자연수를 각 자릿수별로 나누었을 때, 2,3,5,7이 몇 개 있는지 구하려 합니다.

 

예를 들어, 자연수가 29022531일 때, 각 자릿수 중 소수의 위치는 다음과 같습니다.

 

  • 29022531

따라서 소수의 개수는 총 5개입니다.

자연수 number가 매개변수로 주어질 때, number의 각 자릿수 중 소수는 몇 개인지 return하도록 solution함수를 작성했습니다. 

그러나, 코드 일부분이 잘못되어있기 때문에, 몇몇 입력에 대해서는 올바르게 동작하지 않습니다.

주어진 코드에서 한줄만 변경해서 모든 입력에 대해 올바르게 동작하도록 수정하세요.

 

 

 

 

 

 

 


 

 

 

 

 

 

주어진 코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int number) {
    int count = 0;
    while (number >= 0) {
        int n = number % 10;
        if (n == 2 || n == 3 || n == 5 || n == 7)
            count += 1;
        number /= 10;
    }
    return count;
}
int main() {
    int number = 29022531;
    int ret = solution(number);

    printf("solution 함수의 반환 값은 %d 입니다.\n", ret);
}

 

 

 

 

결과(오류) => 프로그램 실행종료 불가

number return
29022531 프로그램 실행지속

 

 

 

 

 

 


 

 

 

 

코드분석(오류해결)

단계 과정
main 각 자리수의 소수부분을 판별할 수인 number을 선언한 후 solution함수를 호출한다.
solution 소수부분이 몇 개인지 저장할 변수 count를 선언한다.
solution - while number가 0 이상일때 계속 반복한다.
1. 각 자리수를 판별해야 하기 때문에, number%10을 n에 저장한다.
2. 이때 일의자리수가 소수(2,3,5,7)이면 count++;을 진행한다. (아닐경우 생략)
3. 판별과정이 끝난 후 number/=10을 진행하여 한자리씩 낮춘다. 
오류 반복이 어느정도 진행되고 마지막 자리수가 number/=10을 만났을 때, number는 0이 아닌 소수(0보다 크고 1보다 작은수)가 된다.
소수는 0 이상이기 때문에 while문은 종료되지 않고 다시 반복한다.
마찬가지로 소수를 10으로 나누었을 때 똑같이 소수(0보다 크고 1보다 작은수)가 된다.
이러한 결과 때문에 while문은 끝나지 않는 무한루트가 되어버린다.

따라서 while문의 조건을 number >= 1로 수정해야 한다.
solution 소수의 개수 count를 return한다.
main 결과를 출력하고 프로그램을 종료한다.

 

 

 

 

 

 

 

 


 

 

 

 

 

결과 코드(최종)

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int solution(int number) {
    int count = 0;
    while (number >= 1) {
        int n = number % 10;
        if (n == 2 || n == 3 || n == 5 || n == 7)
            count += 1;
        number /= 10;
    }
    return count;
}
int main() {
    int number = 29022531;
    int ret = solution(number);

    printf("solution 함수의 반환 값은 %d 입니다.\n", ret);
}

 

 

 

결과

number return
29022531 5

 

 

 

 

 

 

 

 

 

참고 - while문 반복과정(29022531을 입력값으로 가정했을 때)

반복단계 과정
첫번째 반복 1. int n = number%10; 에 의해 일의자리수 1이 n에 저장된다.
2.
1은 소수가 아니기 때문에 count++을 생략한다.
3.
십의 자리수를 판별하기 위해서number/=10를 진행한다. 이때 number는 2902253이된다.
count == 0
두번째 반복 1. int n = number%10; 에 의해 일의자리수(십의자리) 3이 n에 저장된다.
2.
3은 소수이기 때문에 count++을 진행한다.
3.
의 자리수를 판별하기 위해서number/=10를 진행한다. 이때 number는 290225이된다.
count == 1
세번째 반복 1. int n = number%10; 에 의해 일의자리수(백의자리) 5가 n에 저장된다.
2.
5는 소수이기 때문에 count++을 진행한다.
3.
의 자리수를 판별하기 위해서 number/=10를 진행한다. 이때 number는 29022이된다.
count == 2
네번째 반복 1. int n = number%10; 에 의해 일의자리수(천의자리) 2가 n에 저장된다.
2.
2는 소수이기 때문에 count++을 진행한다.
3.
만의 자리수를 판별하기 위해서 number/=10를 진행한다. 이때 number는 2902이된다.
count == 3
다섯번째 반복 1. int n = number%10; 에 의해 일의자리수(만의자리) 2가 n에 저장된다.
2.
2는 소수이기 때문에 count++을 진행한다.
3.
십만의 자리수를 판별하기 위해서 number/=10를 진행한다. 이때 number는 290이된다.
count == 4
여섯번째 반복 1. int n = number%10; 에 의해 일의자리수(십만의자리) 0이 n에 저장된다.
2.
0은 소수가 아니기 때문에 count++을 생략한다.
3.
백만의 자리수를 판별하기 위해서 number/=10를 진행한다. 이때 number는 29가된다.
count == 4
일곱번째 반복 1. int n = number%10; 에 의해 일의자리수(백만의자리) 9이 n에 저장된다.
2.
9는소수가 아니기 때문에 count++을 생략한다.
3.
천만의 자리수를 판별하기 위해서 number/=10를 진행한다. 이때 number는 2가된다.
count == 4
여덟번째 반복 1. int n = number%10; 에 의해 일의자리수(천만의자리) 2가 n에 저장된다.
2.
2은소수이기 때문에 count++을 진행한다.
3.
그 다음의 자리수를 판별하기 위해서 number/=10를 진행한다. 이때 number는 0.2가된다.
count == 5
while문의 종료
number가 1미만이기 때문에 while문을 종료한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GroomEdu

 

goorm

구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다.

www.goorm.io

 

 

 

 

 

 

 

댓글