https://programmers.co.kr/learn/courses/30/lessons/12943
테스트 코드
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/
'코딩테스트연습 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 - JAVA] 핸드폰 번호 가리기 (0) | 2021.11.19 |
---|---|
[프로그래머스 - JAVA] 하샤드 수 (0) | 2021.11.18 |
[프로그래머스 - JAVA] 2018 KAKAO BLIND RECRUITMENT[1차] 다트 게임 (0) | 2021.10.30 |
[프로그래머스 - JAVA] 연습문제 가운데 글자 가져오기 (0) | 2021.10.28 |
[프로그래머스 - JAVA] 위클리 챌린지1주차_부족한 금액 계산하기 (0) | 2021.10.28 |