본문 바로가기
Coding Test/Java Coding Test

[프로그래머스 / 자바] - 조건에 맞게 수열 변환하기 2

by nam_ji 2024. 8. 25.

조건에 맞게 수열 변환하기 2 - LV. 0

문제

  • 정수 배열 arr이 매개변수로 주어집니다.
  • arr의 원소가
  • 50보다 크거나 같은 짝수라면 2를 나누고,
  • 50보다 작은 홀수라면 2를 곱하고 1을 더합니다.
  • 이러한 작업을 반복하다 보면
  • arr(x) == arr(x + 1) 가 존재합니다.
  • x의 가장 작은 값을 출력하는 문제입니다.
  • 입출력 예
    • arr result
      [1, 2, 3, 100, 99, 98] 5


테스트 (인텔리제이)

  • 우선 정수 배열 after와 정수 temp 변수를 선언해줍니다.
  • 이후 배열의 원소들이 같아질 때까지 조건에 맞게 원소들을 계산해야 하기 때문에 while문을 사용하고 answer 값이 0이 아닐 때 멈추도록 해줍니다.
  • for문으로 arr의 크기만큼 순회하도록 하여 조건에 맞게 원소들을 계산하여 after 배열에 추가해줍니다.
  • 조건에 해당하지 않는 원소는 그 값 그대로 after에 담아줍니다.
  • 해당 for문이 종료될 때마다 temp의 값을 1씩 증가하도록 해줍니다.
  • if문으로 Arrays 클래스의 equals 메서드를 사용하여 arr과 after를 비교해주고 같은 배열이면 answer에 temp의 값을 담아주고 while을 탈출할 수 있도록 해줍니다.
  • if문이 false가 나오면 arr에 after 배열을 clone하여 while문이 루프를 돌며 비교할 수 있도록 해줍니다.
package com.namji.codingtest.unsuccess;

import java.util.Arrays;

public class 조건에_맞게_수열_변환하기_2 {
  public static void main(String[] args) {
    /*
    정수 배열 arr이 매개변수로 주어집니다.
    arr의 원소가
    50보다 크거나 같은 짝수라면 2를 나누고,
    50보다 작은 홀수라면 2를 곱하고 1을 더합니다.
    이러한 작업을 반복하다 보면
    arr(x) == arr(x + 1) 가 존재합니다.
    x의 가장 작은 값을 출력하는 문제입니다.

    입출력 예
    arr	                    result
    [1, 2, 3, 100, 99, 98]	5

    입출력 설명
    #1
    위 작업을 반복하면 다음과 같이 arr가 변합니다.
    반복 횟수	arr
    0	  [1, 2, 3, 100, 99, 98]
    1   [3, 2, 7, 50, 99, 49]
    2	  [7, 2, 15, 25, 99, 99]
    3   [15, 2, 31, 51, 99, 99]
    4	  [31, 2, 63, 51, 99, 99]
    5	  [63, 2, 63, 51, 99, 99]
    6	  [63, 2, 63, 51, 99, 99]
    이후로 arr가 변하지 않으며, arr(5) = arr(6)이므로 5를 return 합니다.
     */
    int[] arr = {1, 2, 3, 100, 99, 98};
    int[] after = new int[arr.length];
    int temp = 0;
    int answer = 0;

    while (answer == 0) {
      for (int i = 0; i < arr.length; i++) {
        if (arr[i] >= 50 && arr[i] % 2 == 0) {
          after[i] = arr[i] / 2;
        } else if (arr[i] < 50 && arr[i] % 2 != 0) {
          after[i] = (arr[i] * 2) + 1;
        } else {
          after[i] = arr[i];
        }
      }
      temp++;
      if (Arrays.equals(arr, after)) {
        answer = temp;
      }
      arr = after.clone();
    }
    System.out.println(answer - 1);
  }
}

프로그래머스 코드

import java.util.*;

class Solution {
    public int solution(int[] arr) {
        int[] before = new int[arr.length];
        int temp = 0;
        int answer = 0;
        
        while (answer == 0) {
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] >= 50 && arr[i] % 2 == 0) {
                    before[i] = arr[i] / 2;
                } else if (arr[i] < 50 && arr[i] % 2 != 0) {
                    before[i] = (arr[i] * 2) + 1;
                } else {
                    before[i] = arr[i];
                }
            }
            temp++;
            if (Arrays.equals(arr, before)) {
                answer = temp;
            }
            arr = before.clone();
        }
        return answer - 1;
    }
}