해당 게시물을 비롯해 이 카테고리에는 종종 현재 진행 중인 '같이피움'이라는 교내 튜터링 활동에서 튜터로 활동하며 다시 기억하고 싶은 기초 개념과 문제를 적을 것입니다. 약 2년만에 기초를 다지는 시간이기에 틀린 부분이 있을 수 있습니다. 제 발전에 더 도움이 되기에 지적과 피드백은 언제나 환영입니다.
문제
어떤 정수 n이 짝수면 2로 나누고 홀수면 3을 곱한 다음 1을 더한다. 이렇게 해서 새로 만들어진 숫자를 n으로 놓고 n이 1이 될 때까지 같은 작업을 한다. 예를 들어 n=22이면 다음과 같은 수열이 만들어진다.
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
이때 1이 나올 때까지 만들어진 수의 개수를 (n과 1포함) 사이클 길이라 한다. 예를 들어 n=22인 경우에는 사이클 길이가 16이다. (15 아님) 특정한 수를 파라미터로 받아 위와 같은 수열을 출력하고 사이클 길이를 출력해주는 함수를 작성하시오. 함수의 원형은 다음과 같다.
void get_cycle_number(int n);
입력 예1
Enter a number: 22
출력 예1
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
길이는 16
입력 예2
Enter a number: 32
출력 예2
32 16 8 4 2 1
길이는 6
입력 예3
Enter a number: 1
출력 예3
1
길이는 1
코드
#include<stdio.h>
void get_cycle_number(int n);
int main(void)
{
int n;
printf("Enter number : ");
scanf_s("%d", &n);
get_cycle_number(n);
}
void get_cycle_number(int n)
{
int cnt = 1;
while (n > 0) {
printf("%d ", n);
if (n == 1)
break;
if (n % 2 == 0)
n = n / 2;
else
n = n * 3 + 1;
cnt++;
}
printf("\n길이는 %d\n", cnt);
}
1. 이 문제는 재귀로도 풀 수 있지만 아직 튜티들이 재귀를 배우지 않았기 때문에 반복문으로 풀었다. 문제가 살짝 긴 것 같지만 친절하게 설명해주는 것이고 따지고 보면 간단하다.
2. 우선 1이 나올때 끝난다. 근데 1까지 출력하고 끝나야 하므로 break문을 중간에 써줬다. 반복문의 조건식에 쓰면 1이 출력 안 된다.
3. 사이클 길이 cnt는 n에 대해서 연산을 할 때까지만 구하면 된다. cnt 구해놓고 n이 1이 되었다면 거기까지만 반영되면 된다. 그래서 순서를 n에 대한 연산 뒤에 cnt++;을 넣었다.
4. 정리하면, 반복문 속에서 출력문과 n이 1일 때 끝나는 조건문을 break문을 활용해 적고 난 후, n과 cnt에 대한 연산을 해주면 된다.
'Algorithm > C' 카테고리의 다른 글
[c언어 개념] #6 포인터와 함수 (0) | 2022.07.20 |
---|---|
[c언어 개념] #5 포인터와 배열 (포인터 변수, 포인터 상수, 변수 형태의 문자열, 상수 형태의 문자열, 포인터 배열) (0) | 2022.07.20 |
[c언어 개념] #4 포인터의 이해 (0) | 2022.07.20 |
[c언어 문제] #3 난수 배열 정렬, 선택정렬 알고리즘 (0) | 2022.05.17 |
[c언어 문제] #1 피보나치 수열 값 출력 (0) | 2022.05.04 |