프로그래머스 - level 0 조건에 맞게 수열 변환하기 2
일단은 작업 흐름대로 작성해 보았는데... 일단 테스트 케이스는 통과했다. 그런데...
class Solution {
public int solution(int[] arr) {
int answer = 0;
int[] brr = new int[arr.length];
while(true) {
answer++;
for(int i=0; i<arr.length; i++) {
if(arr[i]>=50 && arr[i]%2==0) arr[i]/=2;
else if(arr[i]<50 && arr[i]%2!=0) arr[i] = arr[i]*2+1;
}
for(int i=0; i<arr.length; i++) {
if(arr[i] != brr[i]) break;
else if(i == arr.length-1) return answer-1;
}
System.arraycopy(arr, 0, brr, 0, arr.length);
if(answer >= 1000) break;
}
return answer;
}
}
케이스 12,13에서 실패가 떴다. 질문하기에 누가 써 둔 조언이 있어서 테스트 케이스에 [63] 넣고 해봤더니 1이 뜬다. 왜..?
고쳐보았다.
가장 처음, 그러니까 첫번째 반복일 때 이전 값과 같아서 출력이 0이 나오려면 반복 전에도 brr이 arr과 같은 값을 가지고 있어야 비교가 된다는 걸 놓쳤다. ㅎㅎ.. 한참 헤맸네...
class Solution {
public int solution(int[] arr) {
int answer = 0;
int[] brr = new int[arr.length];
System.arraycopy(arr, 0, brr, 0, arr.length);
while(true) {
for(int i=0; i<arr.length; i++) {
if(arr[i]>=50 && arr[i]%2==0) arr[i]/=2;
else if(arr[i]<50 && arr[i]%2!=0) arr[i] = arr[i]*2+1;
}
answer++;
for(int i=0; i<arr.length; i++) {
if(arr[i] != brr[i]) break;
else if(i == arr.length-1) return answer-1;
}
System.arraycopy(arr, 0, brr, 0, arr.length);
if(answer > 10) break;
}
return answer;
}
}
참고로 answer > 10 탈출 조건은, 반복이 최대 5번으로 보이는데 혹시 놓친 가능성이 있을까봐 넉넉히 10으로 잡음.
1. 50보다 작은 홀수로 시작 => *2 +1 이므로 결과는 홀수, 아무리 해도 "50 이상의 짝수"가 될 수 없음. 최대 1로 시작해서 1 -> 3 -> 7 -> 15 -> 31 -> 63, 총 5번.
2. 50 이상의 짝수로 시작 => /2 이므로 최댓값인 100으로 해도 100 -> 50 -> 25 -> 51이고, 100보다 작은 짝수라면 /2 하면 50보다 작아지고 그 상태에서 *2 +1 하면 50보다 큰 홀수가 될 것이므로 최대 2 번.
'Study with me > 프로그래머스 L0 마스터하기' 카테고리의 다른 글
프로그래머스 - L0 배열만들기6 (0) | 2024.04.17 |
---|---|
프로그래머스 - L0 소인수분해 (0) | 2024.04.12 |
프로그래머스 - L0 이진수더하기 (0) | 2024.04.10 |
프로그래머스 - L0 컨트롤제트 (0) | 2024.04.10 |
프로그래머스 - L0 리스트자르기 (0) | 2024.04.08 |