Algorithm/C

[c언어 문제] #2 사이클 숫자들, 사이클 길이 출력

하노정 2022. 5. 4. 01:14

해당 게시물을 비롯해 이 카테고리에는 종종 현재 진행 중인 '같이피움'이라는 교내 튜터링 활동에서 튜터로 활동하며 다시 기억하고 싶은 기초 개념과 문제를 적을 것입니다. 약 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에 대한 연산을 해주면 된다.