
내가 생각했을때 문제에서 원하는부분
정수 배열 arr가 주어집니다.
arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다.
이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.
단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.
내가 이 문제를 보고 생각해본 부분
solution 메서드는 입력 배열 arr를 복사한 current 배열을 가지고 시작한다.
next라는 배열에는 이번 반복에서 조건에 맞게 변환한 결과를 저장한다.
반복문 내부에서 배열의 각 원소를 하나씩 확인하며,
50 이상인 짝수라면 해당 원소를 2로 나눈 값을 next에 넣는다.
50 미만인 홀수라면 해당 원소에 2를 곱하고 1을 더한 값을 next에 넣는다.
그 외에는 원본 값을 그대로 next에 넣는다.
변환이 끝나면 current와 next 배열을 원소 단위로 비교한다.
두 배열이 완전히 일치하면 더 이상 변하지 않는 상태이므로, 현재까지 수행한 변환 횟수 x를 반환한다.
그렇지 않으면 current를 next로 갱신하고, 변환 횟수 x를 1 증가시킨 후 다음 반복으로 넘어간다.
이 과정을 반복하여 가장 작은 x 값을 찾는다.
main 메서드에서는 예시 배열 {1, 2, 3, 100, 99, 98}을 가지고 solution 메서드를 호출하여 결과를 출력한다.
코드로 구현
class Solution {
public int solution(int[] arr) {
int x = 0;
int n = arr.length;
int[] current = arr.clone();
int[] next = new int[n];
while (true) {
for (int i = 0; i < n; i++) {
int val = current[i];
if (val >= 50 && val % 2 == 0) {
next[i] = val / 2;
} else if (val < 50 && val % 2 == 1) {
next[i] = val * 2 + 1;
} else {
next[i] = val;
}
}
boolean same = true;
for (int i = 0; i < n; i++) {
if (current[i] != next[i]) {
same = false;
break;
}
}
if (same) {
return x;
}
current = next.clone();
x++;
}
}
}
프로그래머스 코드
package programmers;
// 프로그래머스 조건에 맞게 수열 변환하기 2
public class Main64 {
public int solution(int[] arr) {
int x = 0;
int n = arr.length;
int[] current = arr.clone();
int[] next = new int[n];
while (true) {
for (int i = 0; i < n; i++) {
int val = current[i];
if (val >= 50 && val % 2 == 0) {
next[i] = val / 2;
} else if (val < 50 && val % 2 == 1) {
next[i] = val * 2 + 1;
} else {
next[i] = val;
}
}
boolean same = true;
for (int i = 0; i < n; i++) {
if (current[i] != next[i]) {
same = false;
break;
}
}
if (same) {
return x;
}
current = next.clone();
x++;
}
}
public static void main(String[] args) {
Main64 sol = new Main64();
int[] arr = {1, 2, 3, 100, 99, 98};
int result = sol.solution(arr);
System.out.println(result);
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.