문제로부터 최초 작성한 문장으로부터 불필요한부분과 로직이 틀린 부분을 팀원과 코드리뷰를 통해서 많은 실수 부분을 고쳐나갔다.
//나는 tempNum을 통해 저장하려 했지만 예로 15라는 인풋이 들어 왔을때 첫번째 반복 이후 두번째 반복에 들어 왔을때
// tempNum은 변했지만 첫 if문에서 인풋인 num은 그대로 15로 첫 초기화 상태 그대로 유지되었기 때문에
// 잘못된 접근 방법이다. 주어진 num 변수만 사용했어야 됨.
// * while(tempNum != 1){
//* 2-1) if(num % 2 == 0){ <<<<<<<--------- 이부분이 두번째 이상 반복에서 의미가 없다.
//* tempNum = num / 2;
//* }
//* 2-2) else if(num % 2 != 0){ <<<<<<<--------- 이부분이 두번째 이상 반복에서 의미가 없다.
//* tempNum = num * 3 + 1;
//* }
public int solution(int num) { //15
//if (num >= 1 && num < 8000000) { //코테에서 주어지는 값의 범위는 테스트 실행에서 신뢰하고 진행하는 것이 맞다.
while (num != 1) { // == 1인 순간이 false로 반복문이 탈출되기 때문에 아래 if(num == 1)은 불필요한 코드다.
if (num % 2 == 0) { //15
num = num / 2; //7
} else if (num % 2 != 0) {
num = num * 3 + 1;
}
System.out.println("num==>"+ num);
if (cnt < 500) { // (cnt <= 500) 로 작성했었는데 500이 되는 순간을 생각하면 cnt가 501로 증가하기 때문에 아래 else if문의 500을 건너 뛰게 된다.
cnt++; //1
} else if (cnt == 500) {
cnt = -1;
break;
}
//if (num == 1) { // 1이 되는 순간 알아서 false로 while loop를 탈출하게 되기 때문에 불필요한 부분이다.
// break;
//} 불필요한부분.
}
//}
return cnt;
}
public static void main (String[]args){
Solution solution = new Solution();
System.out.println(solution.solution(626331));
}
}
Java
복사
그런데 또 하나의 문제가 발생했다. 테스트가 일부는 통과하는데 일부는 통과되지않는다?
이런 부분에서 고려할 점은 반복으로 연산되고 있는 num이라는 변수의 타입이었다.
ChatGPT를 통한 해당 부분에 대한 추가적인 설명을 요구했다.
반복문을 통해서 3을 곱하는 부분이 발생하고 분명히 입력값보다 훨씬 큰 값이 나올 가능성이 있었다.
Overflow가 발생하면 반대부호로 바뀌어 버려서 그 다음 반복에서 엉뚱한 값으로 연산을 시작 할 가능성이 있었다. 연산의 대상이 되는 값들인 경우 이 부분을 충분히 생각하면서 더 넓은 long 타입을 사용 할 지 고려 해야겠다는 생각을 하게 되었다.