Suzie's Blog

[프로그래머스] 조건에 맞게 수열 변환하기 2 (JavaScript) 본문

개발/코딩테스트

[프로그래머스] 조건에 맞게 수열 변환하기 2 (JavaScript)

Iuna 2024. 4. 1. 16:38
반응형
SMALL
문제 설명

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

입출력 예 설명

입출력 예 #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 합니다.

 

풀이

할 수 있다고 생각했는데 결국 chatGPT의 도움을 받아 겨우 해결한 문제 ㅠㅠ
그러므로 풀이법만 작성하도록 하겠다!

let currentArray = [...arr]; // arr를 currentArray로 복사
let previousArray = []; // 이전 배열 초기화
let answer = 0; // 반환할 결과값

while(previousArray !== currentArray.toString()) {
	previousArray = currentArray.toString(); // 이전 배열 업데이트
    
    for(let i=0; i < currentArray.length; i++) {
    	if(currentArray[i] >= 50 && currentArray[i] % 2 === 0) {
        currentArray[i] /= 2;
        } else if (currentArray[i] < 50 && currentArray[i]%2 !== 0){
        	currentArray[i] = currentArray[i] * 2 + 1;
        }
    }
	answer++; //반복횟수 증가
}
console.log(answer - 1)

1. 배열이 같은지 비교하는 방법으로는 배열을 string화 시켜서 검사했다. (toString() 사용)
2. while을 사용하여 previousArray가 currentArray.toString()과 같아질 때까지 반복을 한다.
3. while안에 for문을 활용한 반복문을 만들어 currentArray의 배열을 해당조건에 맞게 업데이트 해준다.
4. while loop이 멈출 때 까지 answer이 증가된다
5. currentArray.toString()과 previousArray가 같아지면 반복이 멈추고 answer를 return한다

이렇게 차근차근 분석해보니 풀리는데 나름 복잡했던 문제였던 것 같다.

다음에 같은 문제를 풀어봤을땐 헤메지 않고 풀 수 있길!!

반응형
LIST