일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 로드 밸런싱
- 이미지 최적화
- 인증서
- webp
- nginx
- TLS
- SSH
- gitgub actions
- CI
- 리버스 프록시
- 무중단
- 이미지 압축
- 브라우저
- 렌더링 과정
- 성능 개선
- 배포
- workflow
- 자동화
- aws
- ec2
- nextJS
- 이미지 포맷 변경
- tcp
- SSL
- pm2
- 3-Way HandShake
- https
- 검색엔진최적화
- certbot
- DNS
- Today
- Total
개발일기
[JavaScript] 조건에 맞게 수열 변환하기 2 본문
개요
사실 프로그래머스 문제는 그냥 풀고 끝이였는데 요즘 블로그 까지 쓰는 이유는 무엇인가 하면 슬슬 어려워 지기 시작하기 때문이다. 문제 자체가 이해가 안되는 것도 있고, 어떤 식으로 풀어야 할지 감도 안잡히는 문제도 많다. 그렇기 때문에 많이 찾아보고 문제를 풀게 되는데 이런식으로 푸는게 나는 그렇게 도움이 되지 않는다고 생각하지만 정말 아무 생각없이 풀이를 따라한다면 문제가 된다고 생각한다. 그래서 기록하려고 한다. 어려운 문제들을.
문제 설명
정수 배열 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 합니다.
풀이
function solution(arr) {
var prevArr = arr;
let idx = 0;
while (true) {
const changeArr = prevArr.map((item) => {
if (item >= 50 && item % 2 === 0) return item / 2;
if (item < 50 && item % 2 === 1) return item * 2 + 1;
return item;
});
const array = prevArr.every((item, index) => item === changeArr[index]);
if (array) break;
idx += 1;
prevArr = changeArr;
}
return idx;
}
풀이 내용
1. 먼저 반복을 해야하지만 횟수가 제한이 조건이라서 while문이 떠올랐다. 그래서 조건이 성립되면 원하는 값을 리턴할 수 있도록 했다.
2. prevArr에 들어오는 arr 값을 담았고, 변하는 값은 changeArr에 담았다.
3. prevArr의 값과 changeArr의 값을 비교하기 위해 every() 메서드를 사용해서 비교 했으며, 값이 다르다면 idx에 1을 추가해 주고, prevArr에 changeArr의 값을 담아 계속해서 이전 값과 현재 값을 비교할 수 있도록 했다.
4. 만약 prevArr의 값과 changeArr의 값이 같아지면 break를 통해 while문을 종료하고 idx(반복 횟수)를 리턴한다.
'Algorithm' 카테고리의 다른 글
[JavaScript] 배열 만들기 4 (0) | 2024.06.26 |
---|---|
[JavaScript] 왼쪽 오른쪽 (0) | 2024.06.24 |
[JavaScript] 세 개의 구분자 (0) | 2024.06.20 |
[JavaScript] 리스트 자르기 (1) | 2024.06.19 |
[JavaScript] 2의 영역 (0) | 2024.06.18 |