import static org.assertj.core.api.Assertions.assertThat;
class SolutionTest {
@Test
void testCollatzBasicCase() {
Solution solution = new Solution();
assertThat(solution.solution(6)).isEqualTo(8); // 예제 6은 8번 반복
assertThat(solution.solution(1)).isEqualTo(0); // 1은 반복 없이 바로 0 반환
assertThat(solution.solution(626331)).isEqualTo(-1); // 500번 초과시 -1
}
}
실행 결과:
public int solution(int num) {
long n = num; // int 대신 long으로 오버플로우 방지
int count = 0;
while (n != 1) {
if (count >= 500) return -1; // 500번 이상 반복 시 종료
n = (n % 2 == 0) ? n / 2 : n * 3 + 1;
count++;
}
return count;
}
}
class Solution {
public int solution(int num) {
long n = num; // int 대신 long으로 오버플로우 방지
int count = 0;
while (n != 1 && count < 500) { // 두 조건을 결합
n = (n % 2 == 0) ? n / 2 : n * 3 + 1;
count++;
}
return (count == 500) ? -1 : count;
}
}
| 일반 개발 | TDD |
|---|---|
| 코드 작성 후 테스트 작성 | 테스트 작성 후 코드를 작성 |
| 테스트는 추가 작업처럼 여겨짐 | 테스트가 개발 과정의 일부 |
| 예상 외 동작 발견이 느림 | 테스트가 예상 외 동작을 조기에 발견 |
| 요구사항에서 세부 구현으로 진행 | 테스트를 작성하며 요구사항을 점진적으로 세분화 |