본문 바로가기

Java/Learn_Java

우박수(콜라츠 추측)의 java 코드화, Math.Random활용,

1. 우박수 코드화(콜라츠 추측)

https://namu.wiki/w/%EC%BD%9C%EB%9D%BC%EC%B8%A0%20%EC%B6%94%EC%B8%A1

 

콜라츠 추측 - 나무위키

콜라츠 추측이 풀기 어려운 이유를 알려면 일단 이거부터 알아야 된다. 점근 표기법은 O(f(x))의 형식으로 표기되며 영어로는 Big O notation이다. O(f(x))=g(x)가 의미하는 바는 f(x)에 비해 g(x)의 값이 일정 범위 내에서 항상 같거나 떨어진다는 것이다. 콜라츠 추측은 이 Big O notation에 의한 분류에서 야생 함수로 분류된다. 그리고 야생 함수이기 때문에 헬게이트가 오픈된다. 증가율이 항상 높기 때문. 이것 때문에 심지

namu.wiki

https://terms.naver.com/entry.nhn?docId=3568350&cid=58944&categoryId=58970

 

우박수의 신비

수학의 역사는 수학자들이 어려운 문제들을 풀기 위해 벌여온 사투의 기록이라 할 수 있다. 이 과정에서 새로운 개념, 놀라운 아이디어가 등장하고, 여기서 다시 파생된 문제에 도전하는 과정이 끊임 없이 반복된다. 수학에서 어려운 문제란 문제가 무엇인지 이해하기도 힘든 경우가 대부분이지만, 초등학생도 이해할 수 있는 문제이면서도 전혀 해결의 실마리가 보이지 않는 문제도 드물지 않다. [ 콜라츠의 추측, 3n+1 문제, 우박수 ] 1937년, 박사 학위를 받은

terms.naver.com

이걸 보면 대충 무슨 의미일 것인지 아니깐 생략.

간단히 얘기하면, 어떤 숫자든 짝수는 2 나누고 홀수일 경우 3곱한 후 1 더하는 짓거리를 반복하면,

어떤 수 a -> '우박수 계산짓' -> '우박수 계산짓' -> ... -> '우박수 계산짓' -> 1

이렇게 1로 귀결된다는 것이다.

코드로 정리하면 다음과 같다.

		int n = 14; // 아무 숫자나 넣어도 됨.
		int k = 0; // 카운팅용
		while (true) {
			if (n % 2 != 1) { //짝수면?
				n = n / 2; //2나누고 다시 위로 보내
			} else { // 아니면?(=홀수면?)
				n = n * 3 + 1; // 3 곱하고 1 더해 위로 보내
			}
			System.out.println(n); // 계산 한 번 할때마다 출력
			k++; //몇 번 계산했는지 확인 위해 카운팅
			if (n == 1) { // 마침내 1이 되면?
				break; // 끝!
			} else {
				continue;
			}
		}
        		System.out.println("실행 횟수: " + k);

컴퓨터는 이 미제의 답을 알고 있을까...

사람이 알지 못하는 법칙도 자알 실행되는 것도 참 신기하다.

 

2. Math.Random()의 활용문제.

Math.Random()는 0~0.9까지의 수를 컴터 멋대로 뱉어내는 메소드이다.

보통 인생 역전을 꿈꾸는 숫자를 컴터에 의지하고 싶을 때

우린 다음과 같이 해야 원하는 대로 뱉어낸다.

// 1~45숫자 6개 출력!
		int[] number = new int[6];
		System.out.print("로또숫자: ");
		for (int i = 0; i < 6; i++) { //배열에 랜덤짓한 숫자 6번 넣기
			number[i] = (int) (Math.random() * 45 + 1); //casting
			System.out.print(number[i]+" | "); // 숫자 하나씩 출력
		}

 

우리가 원하는 수는 대부분이 정수이기 때문에, integer로 대부분 casting 하는 것을 쓸 것이다.

 

여기서 선생님은 다음과 같은 조건 하에 랜덤 숫자를 내도록 문제를 주셨다.

 

1. 100~999 숫자 중 중복되는 숫자(ex. 333, 442, 393) 안 나오게 출력

2. 배열 사용하지 말 것.(으악)

 

		int a = 0;
		int ct = 0;
		int ctNum = 0;
		while (true) {
			int k = ((int) (Math.random() * 900) + 100);
			int k100 = k / 100;
			int k10 = k / 10 % 10;
			int k1 = k % 10;
			if (k100 == k10 || k10 == k1 || k100 == k1) {
				ct++;
				continue;
			} else {
				System.out.println(k);
				ctNum++;
			}
			if (ctNum == 10) {
				break;
			}
		} // while
		System.out.println("중복 숫자 삭제 횟수: " + ct);

'Java > Learn_Java' 카테고리의 다른 글

Java의 비트 연산자 이용법  (0) 2020.04.13
6. 클래스_연습문제(은행 계좌)  (0) 2020.04.05
5. 참조 타입_연습문제  (0) 2020.04.05
5. 참조 타입  (0) 2020.03.29
4. 조건문과 반복문_활용문제  (0) 2020.03.29