코딩테스트연습/프로그래머스

[프로그래머스 - JAVA] 콜라츠 추측

:)jun 2021. 11. 16. 22:43

 

https://programmers.co.kr/learn/courses/30/lessons/12943

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

테스트 코드

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class Quiz1_콜라츠추측Test {
	
	Quiz1_콜라츠추측 q;

	@BeforeEach
	void setUp() throws Exception {
		q = new Quiz1_콜라츠추측();
	}

	@Test
	void test1() {
		assertEquals(0 ,q.solution(1));
	}
	@Test
	void test6() {
		assertEquals(8,q.solution(6));
	}
	@Test
	void test16() {
		assertEquals(4,q.solution(16));
	}
	@Test
	void test626331() {
		assertEquals(-1,q.solution(626331));
	}
//	@Test
//	void test7999999() {
//		fail("Not yet implemented");
//	}
// 최댓값쪽은 계산하는게 어려워서 케이스 빼자.

}
public class Quiz1_콜라츠추측 {
	 int numberOfStep = 0;
	 public int solution(int num) {
		 
		 if(num==1) {
			 return 0;
		 }
			 
		 
		 proceedStep((long) num);
		 
		 if(numberOfStep==500) {
			 return -1;
		 }
		 
		 return numberOfStep;
	        
	 }
	 public void proceedStep(long num) {
		 
		 
		 		 
		 if(num%2==0) {
			 num/=2;
		 }
		 
		 else{
			 num*=3;
			 num+=1;
		 }
		 
		 numberOfStep++;
		 if(numberOfStep==500) {
			 return;
		 }
		 if(num==1) {
			 return;
		 }
		 
		 proceedStep(num);
	 }
		 
}
		
// 범위 최소, 최대는 가능하다면 테스트 케이스에 넣어주자.
// else 안쓸수있는 방법이 있을까?
public class Quiz1_콜라츠추측 {
	 int numberOfStep = 0;
	 public int solution(int num) {
		 
		 if(num==1) {
			 return 0;
		 }
			 
		 
		 proceedStep((long) num);
		 
		 if(numberOfStep==500) {
			 return -1;
		 }
		 
		 return numberOfStep;
	        
	 }
	 public void proceedStep(long num) {
		 
		 
		 		 
		 if(num%2==0) {
			 num/=2;
			 numberOfStep++;
			 if(numberOfStep==500) {
				 return;
			 }
			 if(num==1) {
				 return;
			 }
			 proceedStep(num);
			 return;
		 }
		 if(num%2!=0) {
			 num*=3;
			 num+=1;
			 numberOfStep++;
			 if(numberOfStep==500) {
				 return;
			 }
			 if(num==1) {
				 return;
			 }
			 proceedStep(num);
			 return;
		 }
	 }
		 
}

//가능하긴하다. 더 복잡해 보이는데 왜 이게 더 좋은 코드인가? 왜 else를 못쓰게 하는거지?
//if블록 내에서 return을 할 경우, else블록이 필요없다.
//설명이 좋은 블로그가 있어서 하단에 첨부한다.

https://tecoble.techcourse.co.kr/post/2020-07-29-dont-use-else/

 

else 예약어를 쓰지 않는다

The ThoughtWorks Anthology의 더 나은 소프트웨어를 향한 9단계: 객체지향 생활 체조 중 규칙…

tecoble.techcourse.co.kr