고양이와 코딩
[프로그래머스] 12월04일 ~ 12월10일 본문
12월04일
특정 문자열로 끝나는 가장 긴 부분 문자열 찾기
내 풀이
function solution(myString, pat) {
let index = myString.lastIndexOf(pat);
let answer = myString.substring(0, index + pat.length);
return answer;
}
문자열이 몇 번 등장하는지 세기
내 풀이
function solution(myString, pat) {
let answer = 0;
let found = myString.indexOf(pat);
while (found !== -1){
answer++;
found = myString.indexOf(pat, found + 1);
}
return answer;
}
indexOf 사용!! 아직 익숙하진 않지만 생각은 난다..
indexOf 함수는 값이 없으면 -1을 반환하므로 while문에 조건을 저렇게 넣어주고, found + 1로 찾은 인덱스 이후부터
다시 찾는다 ㅎㅎ
ad 제거하기
첫 번째 풀이
function solution(strArr) {
for (let i = 0; i < strArr.length; i++){
if(strArr[i].includes("ad")){
strArr.splice(i, 1);
}
}
return strArr;
}
이렇게 하면 첫 테스트 케이스만 통과하고 나머지는 전부 실패한다.
"ad"가 들어간 문자열이 한 개 이상일수도 있으니 ! splice를 사용하지 말고 다른 방법을 찾아보자
제출한 코드
function solution(strArr) {
return strArr.filter(item => !item.includes("ad"));
}
filter함수로 ad가 들어가지 않은 것만 추출한다.
공백으로 구분하기 1
내 풀이
function solution(my_string) {
var arr_str = my_string.split(" ");
return arr_str;
}
공백으로 구분하기 2
내 풀이
function solution(my_string) {
let arr_str = my_string.split(/\s+/).filter(Boolean);
return arr_str;
}
공백을 나타나는 정규표현식 \s+ 를 사용한다
12월05일
x 사이의 개수
내 풀이
function solution(myString) {
var answer = [];
var splitStr = myString.split("x");
splitStr.forEach((value, index) => {
answer.push(value.length);
})
return answer;
}
문자열 잘라서 정렬하기
내 풀이
function solution(myString) {
const splitStr = myString.split("x");
const filteredStr = splitStr.filter(value => value !== "");
return filteredStr.sort();
}
간단한 식 계산하기
내 풀이
function solution(binomial) {
const answer = eval(binomial);
return answer;
}
eval() 함수는 사용을 지양하는 편이 좋습니다...
그래서 다르게도 풀어봤습니다
function solution(binomial) {
const [a, op, b] = binomial.split(" ");
const numA = parseInt(a);
const numB = parseInt(b);
if (op === "+") {
return numA + numB;
} else if (op === "-") {
return numA - numB;
} else {
return numA * numB;
}
}
문자열 바꿔서 찾기
내 풀이
function solution(myString, pat) {
const splitStr = myString.split("");
splitStr.forEach((value, index) => {
if(value === "A") {
splitStr[index] = "B"
} else {
splitStr[index] = "A"
}
})
return splitStr.join('').includes(pat) ? 1 : 0;
}
12월06일
세 개의 구분자
첫 번째 풀이
function solution(myStr) {
const arrStr = myStr.split(/[abc]/)
return arrStr.length === 0 ? ["EMPTY"] : arrStr.filter(v => v !== "");
}
이렇게 하면 빈 배열일 경우에 ["EMPTY"]가 반환되지 않는다
제출한 코드
function solution(myStr) {
const arrStr = myStr.split(/[abc]/);
const nonEmptyArr = arrStr.filter(v => v !== "");
return nonEmptyArr.length === 0 ? ["EMPTY"] : nonEmptyArr;
}
nonEmptyArr로 한번 더 문자열을 걸러 주어야 제대로 ["EMPTY"] 가 반환된다!
배열의 원소만큼 추가하기
내 풀이
function solution(arr) {
var X = [];
for(let i = 0; i < arr.length; i++){
for(let j = 0; j < arr[i]; j++){
X.push(arr[i]);
}
}
return X;
}
빈 배열에 추가, 삭제하기
내 풀이
function solution(arr, flag) {
let X = [];
flag.forEach((value, index) => {
if (value) {
const repeatArr = Array(arr[index] * 2).fill(arr[index]);
X = [...X, ...repeatArr];
} else {
X = X.slice(0, X.length - arr[index]);
}
});
return X;
}
forEach문 안에서 repeatArr 변수를 만들지 않고 !! X에 바로 할당하면 오류가 난다는 것을 기억하자 !!
배열 만들기6
내 풀이
function solution(arr) {
let stk = [];
for (let i = 0; i < arr.length;) {
if (stk.length === 0) {
stk.push(arr[i]);
i++;
} else if (stk[stk.length - 1] === arr[i]) {
stk.pop();
i++;
} else {
stk.push(arr[i]);
i++;
}
}
return stk.length !== 0 ? stk : [-1];
}
무작위로 K개의 수 뽑기
내 풀이
function solution(arr, k) {
var answer = [];
for (let i = 0; i < arr.length; i++){
if(!answer.includes(arr[i]) && answer.length < k){
answer.push(arr[i]);
}
}
let remainArr = k - answer.length;
if (remainArr > 0){
answer = answer.concat(new Array(remainArr).fill(-1));
}
return answer;
}
처음에는 for문을 while ( answer.length <= k) 이렇게 감싸주었는데, 문제에서도 말했듯 배열이 완성되도 answer의 길이가 k보다 작을 수 있으므로 이렇게 작성하면 안된다 !! (문제를 꼼꼼히 읽자)
대신 if문에 &&로 조건을 추가해주자.
그리고 k보다 길이가 작은 배열은 concat과 fill을 이용해서 -1로 채워서 반환해준다 ㅎㅎ
배열의 길이를 2의 거듭제곱으로 만들기
내 풀이
function solution(arr) {
let len = arr.length;
let pows = Math.pow(2, Math.ceil(Math.log2(len)));
while (arr.length < pows) {
arr.push(0)
}
return arr;
}
꼬옥 !! 다시 풀어봅시다 !!
처음에는 arr의 길이가 1000 이하로 제한되어 있어서 pows배열에 [2, 4, 8, 16, 32, 64, 128, 256, 512] 를 담아서 풀려고 했는데,
뭔가 계속 오류가 나서... ㅋ 수학적인 방법을 찾아찾아 풀게 되었다.
Math.log2(len)으로 밑이 2인 로그로 계산하고, Math.ceil()로 소수점 이하를 올림한다. 그리고 Math.pow로 2의 거듭제곱을 구하면
현재 arr.length에서 가장 가까운 2의 거듭제곱을 계산해준다!
배열 비교하기
내 풀이
function solution(arr1, arr2) {
const arr1_len = arr1.length;
const arr2_len = arr2.length;
let arr1_sum = arr1.reduce((acc, curr) => acc + curr, 0);
let arr2_sum = arr2.reduce((acc, curr) => acc + curr, 0);
if (arr1.length !== arr2.length){
return arr1_len > arr2_len ? 1 : -1;
} else {
if(arr1_sum !== arr2_sum){
return arr1_sum > arr2_sum ? 1 : -1;
} else {
return 0;
}
}
}
문자열 묶기
내 풀이
function solution(strArr) {
const groups = strArr.reduce((acc, str) => {
const len = str.length;
acc[len] = (acc[len] || 0) + 1;
return acc;
}, {});
return Math.max(...Object.values(groups));
}
객체를 만들어서 { '1' : 1, '2' : 2 , '3' :1 } 이런식으로 키 값쌍으로 저장을 한 뒤 마지막에 그 중 가장 큰 값을 출력합니다 !
12월08일
배열의 길이에 따라 다른 연산하기
내 풀이
function solution(arr, n) {
return arr.map((value, index) => {
if((arr.length % 2 !== 0 && index % 2 === 0) || (arr.length % 2 === 0 && index % 2 !== 0)){
return value + n;
}
return value;
});
}
뒤에서 5등까지
내 풀이
function solution(num_list) {
const sorted_num = num_list.sort((a, b) => a - b);
return sorted_num.slice(0, 5);
}
뒤에서 5등 위로
내 풀이
function solution(num_list) {
const sorted_num = num_list.sort((a , b) => a - b);
return sorted_num.slice(5, sorted_num.length);
}
'javascript' 카테고리의 다른 글
[프로그래머스] 정수를 나선형으로 배치하기 (1) | 2023.12.17 |
---|---|
[프로그래머스] 12월11일 ~ 12월17일 (0) | 2023.12.11 |
[프로그래머스] 알고리즘 12월01일 ~ 12월10일 (0) | 2023.12.01 |
[프로그래머스] 11월29일 ~ 12월03일 (0) | 2023.11.29 |
[프로그래머스] 11월21일 ~ 11월27일 (0) | 2023.11.21 |