티스토리 뷰

알고리즘 문제 풀이

문제 1. The 3n + 1 problem

따분한놈 2015. 10. 17. 21:14

정수 n이 짝수면 2로나누고, 홀수면 3을 곱한 다음 1을 더한다.

이렇게 해서 n=1이 될 때까지 작업을 반복한다.

예) n=22

22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

 

이 가설은 1,000,000까지의 정수에 대해서는 참이다.

 

n이라는 값이 입력되고, 1이 나올 떄까지 만들어 진 수의 갯수를 사이클 길이라고 할때 22의 사이클 길이는 16이다.

이떄 i,j라는 두개의 수가 주어 졌을 때 i,j 두 수를 포함한 사이의 모든 수의 최대 사이클 길이를 구하라.

 

입력은 i, j 한쌍이며 모든 정수는 1,000,000보다 작고 0보다 크다.

 

입력 예)

1 10

100 200

201 210

900 1000

 

출력 예

1 10 20

100 200 125

201 210 89

900 1000 174

 

하.. 아직 문제 1번이라 쉽게 풀었는데 문제는 사이트에 검사 받는 과정이...

뭐가 잘못 된건지 처음엔 계속 컴파일 에러...

보니깐 c++인데 #include<stdio.h>나 printf, scanf등을 써서 그랬던 것 이었습니다.

그리고 이제 다 고쳤다 싶었는데 이번엔 잘못된 답이라고..

이것도 찾다보니

0보다 작거나 같을때, 1,000,000보다 크거나 같을 때 등 예외상황에 대한 처리, 그리고 인풋에서 들어오는 인수의 순서에 상관없이

결과값이 나오게 해야 됐던게 문제가 됐습니다.

그런 문제들을 다 해결하니 제대로 나오는...

아무튼 문제를 푸는 것 보다 힘이 많이 들었습니다.

 

 

 

#include 
using namespace std;

int Algorithm1( int n,int *c )
{
	(*c)++;
	if( 1==n )
		return 1;
	if( 0==n%2 )
		Algoritm1( n/2,c );
	else
		Algoritm1(n*3+1,c);
	return *c;
}

int main()
{
	int a=0,b=0;

	while( cin>>a >> b )
	{
		if( a<=0 || b <=0 || a>=1000000 || b >=1000000 )
			break;

		int iMax = 0;
		int cc = 0;
		int c,d;
		c = a;
		d = b;
		if( a>b)
		{
			c = b;
			d= a;
		}

		for( int i=c; i<=d; i++ )
		{
			cc=0;
			int a = Algorithm1(i, &cc );
			iMax =  iMax > a ? iMax  : a;
		}

		cout << a <<" " << b << " " << iMax << endl;
	}

	return 0;
}

'알고리즘 문제 풀이' 카테고리의 다른 글

문제 2. Minesweeper  (0) 2015.10.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
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
글 보관함