문제 설명 :
정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.
단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.
문제를 읽으면서 필요한 작업을 생각해내는 건 어렵지 않았다.
1. 배열을 변환하는 작업이 하나 필요하다.
2. 변환된 배열과 이전 배열을 비교해야 하므로 이전 배열을 변수로 저장돼야 하고 이게 계속 갱신돼야 한다.
3. every 메소드로 비교 작업을 진행할 변수나 함수가 필요하다.
4. 일치할 때까지 변환이 반복되어야 한다.
5. 반복하면서 카운트를 올린다.
다만 로직을 매끄럽게 짜지 못하고 계속 수정을 반복했다.
할수록 점점 꼬이기만 해서...결국 구글링의 도움을 받았다😂
풀이는 이분 것을 참고.
[프로그래머스] 조건에 맞게 수열 변환하기 2
정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.이러한 작업을 x번 반복한 결과인 배열을 arr(
velog.io
왜인지 if문을 else if로 작성하면 카운트가 1번 더 된다....어째서??????
isSame 변수의 every 메소드에서 판별함수는 저것 대신에 includes 메소드를 사용해도 될 것 같다.
const isSubset = (array1, array2) => array2.every((element) => array1.includes(element));
every() 메소드 공식 문서에 있는 예시다. 부분 집합인지 체크하는 로직인데 위 문제에 응용할 수 있을 것 같다.
추가로 다른 사람의 코드를 구경하다가 색다른 방법이고 코드도 매우 깔끔한 게 있어서 첨부한다.
function solution(arr) {
const isConvertable = (v) => (50 <= v && v % 2 === 0) || (v < 50 && v % 2 === 1);
const convert = (arr) => arr.map((v) => (v % 2 ? v * 2 + 1 : v / 2)).filter(isConvertable);
let answer = 0;
let current = arr.filter(isConvertable);
while (0 < current.length) {
current = convert(current);
answer += 1;
}
return answer;
}
변환해야 할 원소가 있는지를 필터링해서 원소 갯수로 조건을 짜는 로직이다.
배울 점이 많은 코드였다.
'코딩테스트 > 프로그래머스 기초 트레이닝' 카테고리의 다른 글
[Javascript] 두 수의 합 (0) | 2023.07.13 |
---|---|
[Javascript] 문자 개수 세기, 배열 만들기 4 (0) | 2023.07.13 |
[Javascript] 1로 만들기 (+답변 추가) (0) | 2023.06.28 |
[Javascript] 세로 읽기 (0) | 2023.06.27 |
[Javascript] 수열과 구간 쿼리 3 (0) | 2023.06.27 |
[Javascript] 날짜 비교하기 (0) | 2023.06.23 |
[Javascript] 특이한 이차원 배열 1 (0) | 2023.06.13 |
[Javascript] 특이한 이차원 배열 2 - every() (0) | 2023.06.13 |