프로그래머스 조건에 맞게 수열 변환하기 2

KIMYEONGJUN·2026년 6월 27일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

정수 배열 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);
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글