연습장

54. 조건에 맞게 수열 변환하기 2 본문

프로그래머스/0단계

54. 조건에 맞게 수열 변환하기 2

js0616 2023. 7. 10. 21:36

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

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

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

 


주어진 배열의 원소에 대해서

50 이상이면서 짝수이면 2로 나누고

50 미만이면서 홀수이면 2를 곱하고 1 을 더한다. 

 

위의 과정을 모든 원소에 1번씩 적용한것을 arr(1) 이라 하며 

더이상 배열의 원소가 변하지 않는 배열이 되는  arr(i) = arr(i+1) 인 i 를 구하는 문제이다.

 

먼저 배열이 변하도록 하기 위해서

 

map 함수를 이용하여 진행하였다.

' 50 이상이면서 && 짝수인가 ?  참이면  / 2 를 진행 : 

거짓이라면  50 미만 && 홀수인가 ? 참이면 *2 + 1 을 진행 : 아니라면 num 그대로  ' 를 반환 하여 다시 배열로 만든 것을 arr 에 저장(갱신) 하였다. 

 

그리고 기존 배열과 바뀐 배열을 비교하기 위해서 저장 할 필요를 느꼈고

 

ans 라는 배열에 각각의 arr(i) 를 저장하였다.

 

ans = [ arr[0] , arr[1] , arr[2] , .... ]

 

맨 처음 기존 배열을 push 하고

map 함수를 통해 새로 갱신된 arr(1) 함수를 arr 에 다시 push 하게되면

 

ans = [ arr[0] , arr[1] ] 상태가 되고 

 

if 문을 이용하여 배열을 비교하는데 , 배열끼리는 비교가 안되서 문자열로 바꿔서 비교했다. 

결과가 참이면 break 하도록하고 거짓이면  다시 while 문을 통해 반복하여 

배열을 새로 갱신 arr[2] 를 구해서  ans 에 push 하도록 한다. 

 

이를 반복하여 배열이 같게되면 if 문의 break 을 통해 while 문에서 나오게 되고 

그때 i 값을 이용하여 원하는 값을 구했다. 

        function solution(arr) {
            let ans = []
            let i = 0
            let x = 0
            ans.push(arr)

            while (true) {
                arr = arr.map(num => {
                    return num >= 50 && num % 2 == 0 ? num = num / 2 :
                        num < 50 && num % 2 == 1 ? num = num * 2 + 1 : num
                })
                ans.push(arr)
                i++
                if (ans[i].join('') == ans[i - 1].join('')) {
                    break;
                }
            }
            return i - 1
        }

'프로그래머스 > 0단계' 카테고리의 다른 글

56. 간단한 식 계산하기  (0) 2023.07.11
55. 대문자로 바꾸기  (0) 2023.07.11
53. 왼쪽 오른쪽  (0) 2023.07.10
52. 배열 조각하기  (0) 2023.07.10
51. 2의 영역  (1) 2023.07.10