U E D R , A S I H C RSS

3n 1/��현

문제

2005-12-30 14:39:20 Accepted 3.256 436 56031 C++ 100 - The 3n + 1 problem

소�

처�으로 채�로봇�게서 Accepted�는 �격�� 메시지를 안겨준 문제.
정� 수� 없� 많� 시�를 했었다. 하지만 너무나� 꼼꼼하면서� ��지 못한 테스트 케�스� 항� 좌절했다.

어려웠� �

1. 입력 2개가 범위로 들어가는 � 단순히 첫 번째 입력� � 것��는 추측� 잘못�었다. (첫 번째 수가 � 경우� 있었�)
2. 비트연산�� 위력� 대단함� �꼈다. �홀�별(& 연산�), 나누기2(right shift 1) - 수행��가 엄청 향��.
3. 알고리즘� 대한 명확한 파악� 루프 �는 횟수를 현저히 줄여줌� 배웠다. - 홀수 뒤엔 반드시 �수가 온다.
4. 첫 번째 당했� 입력� 순서 �기 문제가 출력�서� 다시 �� - 단순히 스왑� 시켜버림으로� �래 입력� �가지는 모습� 보였다.

코드

~cpp
// The 3n + 1 problem
// UVa ID : 100
#include <iostream>
using namespace std;
int cycle_length(int input);

int main()
{
	int input1, input2;

	while (cin >> input1 >> input2)
	{
		int i;
		int max_count = -1;
		int temp = 0;
		
		// 입력� 순서가 절대 뒤바뀌면 안�다!!
		cout << input1 << " " << input2 << " ";

		// 앞� 들어오는 입력� 뒤� 입력보다 � � 경우 (for문 �러 방지)
		if (input1 > input2)
		{
			int swap = input1;
			input1 = input2;
			input2 = swap;
		}

		for (i = input1; i <= input2; i++)
		{
			temp = cycle_length(i);				// cycle legnth 찾기
			if (temp > max_count)
				max_count = temp;				// � 수를 max_count로
		}
		cout << max_count << endl;
	}

	return 0;
}

// cycle length 구하기
int cycle_length(int input)
{
	int argument = input;		// 전달��로 넘어온 수 저장
	int count = 0;				// 카운트 변수
	
	while (true)
	{
		// 종료 조건
		if (argument == 1)
		{
			count++;
			break;
		}

		// LSB가 0�면 �수, 1�면 홀수�다.
		if ((argument & 1) == 0)
		{
			// 나누기 2는 right shift를 한 번 하는 것과 같다.
			argument >>= 1;
			count++;
		}
		else
		{
			// 홀수�면 반드시 다�� �수가 온다.
			argument = 3 * argument + 1;
			argument >>= 1;
			count += 2;
		}
	}

	return count;
}

�글

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:17
Processing time 0.0563 sec