티스토리 뷰
문제
자연수의 각 자릿수 중에서 소수는 몇 개인지 구하려 합니다.
즉, 자연수를 각 자릿수별로 나누었을 때, 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문을 종료한다. |
goorm
구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다.
www.goorm.io
'[코테] > [GroomEdu]' 카테고리의 다른 글
[COS PRO 2급] 2차 9번_투표에 대한 후보 찾기 (0) | 2021.05.12 |
---|---|
[COS PRO 2급] 2차 7번_섭씨, 화씨 온도 바꾸기 (C/C++) (0) | 2021.05.11 |
[COS PRO 2급] 2차 5번_몬스터 공격하기 (C/C++) (0) | 2021.05.10 |
[COS PRO 2급] 2차 6번_엘리베이터의 총 이동거리 구하기 (C/C++) (0) | 2021.05.10 |
[COS PRO 2급] 2차 4번_5글자 이상인 단어 배열하기 (C/C++) (0) | 2021.05.09 |
댓글
공지사항
최근에 올라온 글
TAG
- 프로그래머스
- cospro기출문제
- YBM
- 구름에듀 기출문제
- 기출문제
- C
- COSPRO 2급
- programmers
- YBM기출
- CosPro
- 1급
- C++
- 자바
- 알고리즘
- Cos Pro
- lv2
- groomedu
- 연습문제
- 코딩테스트
- 코스프로
- c언어
- 구름 기출문제
- cospro기출
- lv1
- Java
- groom
- 배열
- 배열활용문제
- 구름에듀
- c언어 기출문제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함