프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 조건에 맞게 수열 변환하기 2(Java)

Sigfriede 2023. 6. 3. 01:10

  문제 설명

  정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.

  이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.

  단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.

 

  제한사항

  • 1 <= arr의 길이 <= 1,000,000
    • 1 <= arr의 원소의 값 <= 100

 

  입출력 예

arr result
[1, 2, 3, 100, 99, 98] 5
class Solution {
    public int solution(int[] arr) {
        int answer = 0;
        boolean bool = true;
        while (bool) {
            answer++;
            bool = false;
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] >= 50 && arr[i] % 2 == 0) {
                    arr[i] /= 2;
                    bool = true;
                } else if (arr[i] < 50 && arr[i] % 2 != 0) {
                    arr[i] = arr[i] * 2 + 1;
                    bool = true;
                }
            }
        }
        return answer - 1;
    }
}

  boolean형 변수를 생성하고 초기화 값을 true로 지정합니다.

  while문은 bool이 true인 경우에 반복합니다. while문이 반복되는 동안 answer가 1씩 증가합니다. bool을 false로 변경합니다.

  for문이 arr의 길이만큼 순회합니다.

  if문에서 arr의 i번째 원소가 50보다 크거나 같고 동시에 arr의 i번째 원소가 짝수라면 arr의 i번째 원소를 2로 나누기 할당합니다. bool을 true로 변경합니다.

  else if에서 arr의 i번째 원소가 50보다 작고 동시에 arr의 i번째 원소가 홀수라면 arr의 i번째 원소에 2를 곱한 값에 1을 더합니다. bool을 true로 변경합니다.

  만약 while문이 실행되었으나 조건문이 실행되지 않는다면 while문이 실행될 때 bool은 false로 변경된 이후, false를 유지할 것입니다. false일 때에는 while문이 실행되지 않으므로 반복문은 종료될 것입니다.

  다만 bool을 false로 변경한 이후 조건문이 동작하지 않는 경우에도 answer가 증가하고 있으므로, 반환하기 전 1을 빼야 올바른 답을 반환할 수 있습니다.