1. 조건에 맞게 수열 변환하기 1
[문제 설명]
정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다. 그 결과인 정수 배열을 return 하는 solution 함수를 완성해 주세요.
[답변]
function solution(arr) {
return arr.map((v) => {
if(v >= 50 && v % 2 === 0)
return v / 2;
else if(v < 50 && v % 2 !== 0)
return v * 2;
else
return v;
});
}
💡 map 안에 callback 함수를 작성할 때 {} 중괄호를 사용하면 내부에도 return을 해주어야 값을 반환한다. 중괄호 없이 함수를 작성하면 return 없이 값 반환 가능.
더 깔끔하게 작성하면 이렇게!
function solution(arr) {
return arr.map((v) => {
if(v >= 50 && v % 2 === 0) return v / 2;
if(v < 50 && v % 2 !== 0) return v * 2;
return v;
});
}
2. 조건에 맞게 수열 변환하기 2
[문제 설명]
정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.
이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.
단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.
[답변]
function solution(arr) {
let idx = 0;
while(true) {
const changeArray = arr.map((v) => {
if(v >= 50 && !(v % 2)) return v / 2;
if(v <= 50 && v % 2) return v * 2 + 1;
return v;
});
const nextArray = arr.every((v, i) => v === changeArray[i])
if(nextArray) break;
idx += 1;
arr = changeArray;
}
return idx;
}
💡 뭔소린가... 이해가 오래 걸렸고, 구글의 도움을 조금 받아 풀어보았다. 이 전에 풀었던 문제로 배열을 만들고, every()를 활용해 배열 두 개의 값이 같은 지 판별하여 while문을 벗어나게 했다. 🤦♀️
📌every() : 배열의 모든 요소가 주어진 조건을 만족히는지 여부를 확인하는 데 사용
array.every(callback(element, index, array), thisArg);
- callback: 배열의 각 요소에 대해 실행될 함수로, 아래 매개변수를 가진다.
- element: 현재 처리 중인 요소의 값
- index (선택적): 현재 처리 중인 요소의 인덱스
- array (선택적): every()를 호출한 배열 자체
- thisArg (선택적): 콜백 함수 내에서 사용할 this 값
3. 1로 만들기
[문제 설명]
정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다. 예를 들어 10이 있다면 다음과 같은 과정으로 1이 됩니다.
- 10 / 2 = 5
- (5 - 1) / 2 = 4
- 4 / 2 = 2
- 2 / 2 = 1
위와 같이 4번의 나누기 연산으로 1이 되었습니다.
정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return하도록 solution 함수를 완성해주세요.
[답변]
function solution(num_list) {
let count = 0;
num_list.forEach((v) => {
while(v !== 1) {
v = v % 2 ? (v - 1) / 2 : v / 2;
count++;
}
});
return count;
}
💡 forEach()로 num_list 배열을 순회하며 값이 1이 될 때 까지 홀 / 짝수를 구분하여 연산을 진행해줬다. 그리고 연산 횟수만큼 count++로 카운팅하고 return
4. 길이에 따른 연산
[문제 설명]
정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.
[답변]
function solution(num_list) {
return num_list.reduce((a, c) => num_list.length >= 11 ? a + c : a * c );
}
💡 reduce()를 활용해 풀이했다.
5. 원하는 문자열 찾기
[문제 설명]
알파벳으로 이루어진 문자열 myString과 pat이 주어집니다. myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요.
단, 알파벳 대문자와 소문자는 구분하지 않습니다.
[답변]
function solution(myString, pat) {
const str = myString.toUpperCase();
const strPat = pat.toUpperCase()
return str.indexOf(strPat) >= 0 ? 1 : 0;
}
💡 indexOf()로 값이 반환되면 문자열에 있다는 거니까 1 출력, 아니면 0 출력 해주었다. 근데 includes() 쓰면 되는 걸 잊음
function solution(myString, pat) {
const str = myString.toUpperCase();
const strPat = pat.toUpperCase()
return str.includes(strPat) ? 1 : 0;
}
💡 편안
'프로그래머스 > Lv. 0 코딩 기초 트레이닝' 카테고리의 다른 글
[프로그래머스] Lv.0 배열의 길이를 2의 거듭제곱으로 만들기 / JS (0) | 2023.08.05 |
---|---|
[프로그래머스] 코딩 기초 트레이닝 Day 16 / JS (0) | 2023.08.04 |
[프로그래머스] 코딩 기초 트레이닝 Day 14 / JS (0) | 2023.08.02 |
[프로그래머스] 코딩 기초 트레이닝 Day 13 / JS (0) | 2023.08.01 |
[프로그래머스] 코딩 기초 트레이닝 Day 12 / JS (0) | 2023.07.31 |