https://programmers.co.kr/learn/courses/30/lessons/12947
class Solution {
public int solution(int num) {
int answer = 0;
//연산과정에서 int단위를 넘어가기 때문에 long으로 변환 필요
long n = (long)num;
//500회에 대한 조건을 만족시키기 위해 501번 실행
for (int i = 0; i < 501; i++) {
if (n > 1 && n % 2 == 0) {
n /= 2;
answer++;
} else if (n > 1) {
n = n * 3 + 1;
answer++;
} else if (n == 1) { //위의 두 조건에서 모두 n>1이 있어 없어도 되는 부분
break;
}
}
//answer가 500번 이상이면 조건에 따라 -1 할당
if (answer > 500) answer = -1;
return answer;
}
}
문제 풀면서 고민이 됬던 부분은 여러 조건들을 어떻게 조합하느냐, 였다.
500번을 반복해도 1이 되지 않는다는 부분이 있었는데, 이를 해결하기 위해 의도적으로 for문을 501번 돌려서 answer가 500이상(혹은 ==501이어도 됨)이면 -1이 되도록 하였다.
또 n이 1이 되면 for문을 더 진행하지 않도록 해야 했는데, if문을 구성할 때 이미 n>1이라는 조건이 있어서
굳이 별도로 n ==1일 경우 break를 하지 않아도 되었다.
for문 안에서 if문을에 해당되는 경우가 없다면 그냥 for문을 끝내는지, 아니면 횟수만큼 계속 도는 것인지 잘 모르겠다.
지금은 큰 문제가 안되지만 코드가 복잡해지면 효율성에서 문제가 될 수도 있을 것 같다.
'Language > JAVA' 카테고리의 다른 글
[프로그래머스] 3진법 뒤집기 (0) | 2022.01.19 |
---|---|
[프로그래머스] 하샤드 수 (0) | 2022.01.19 |
[프로그래머스] 제일 작은 수 제거하기 (0) | 2022.01.19 |
[프로그래머스] 정수 제곱근 판별 (0) | 2022.01.18 |
[프로그래머스] 정수 내림차순으로 배치하기 (0) | 2022.01.18 |