Front-End

프로그래머스 기초트레이닝 19일차 본문

알고리즘

프로그래머스 기초트레이닝 19일차

jeongsso 2023. 10. 19. 17:36

페이지 1만 남았습니다 드디어 ㅎㅎ

 

 

 

문제 94.  문자열이 몇 번 등장하는지 세기


문제 설명

문자열 myString과 pat이 주어집니다. 
myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.

 

입출력 예

myString pat result
"banana" "ana" 2
"aaaa" "aa" 3

 

입출력 예 설명

"banana"에서 1 ~ 3번 인덱스에서 한 번, 3 ~ 5번 인덱스에서 또 한 번 "ana"가 등장해서 총 두 번 등장합니다.
따라서 2를 return 합니다.

"aaaa"에서 0 ~ 2번 인덱스에서 한 번, 1 ~ 3번 인덱스에서 한 번, 2 ~ 4번 인덱스에서 한 번 "aa"가 등장해서 총 세 번 등장합니다. 
따라서 3을 return 합니다.

 

저의 풀이!

function solution(myString, pat) {
 
    let answer = 0;

    for (let i = 0; i <= myString.length - pat.length; i++) {
        if (myString.slice(i, i + pat.length) === pat) {
            answer++;
        }
    }
    return answer;
}

console.log(solution('banana', 'ana'));

 

 

메모

일단 등장하는 것을 확인해서 count를 해줘야하기때문에 숫자를 늘릴 변수하나랄 잡아두었습니다.
그리고나서 반복문을 돌리지만, 전체의 글자수 빼기 포함되는지 확인되는 글자수를 빼주었는데, 이 이유는 
포함되는 숫자를 제외하고 돌려야 제한된 글자수를 넘어가지않고 확인할 수 있기때문입니다.

그리고 조건문에서 slice를 시행했을 때 그게 pat 과 동일한 글씨가 있다면 count를 할 answer의 숫자를 하나씩 증가시켜주었습니다.

 

 

 

 

 

문제 95.  특정 문자열로 끝나는 가장 긴 부분 문자열 찾기


문제 설명

문자열 myString과 pat가 주어집니다. 
myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.


입출력 예

myString pat result
"AbCdEFG" "dE" "AbCdE"
"AAAAaaaa" "a" "AAAAaaaa"

 

 

입출력 예 설명

"AbCdEFG"에서 "dE"는 한 번 등장하며 처음부터 해당 위치까지 잘라내면 "AbCdE"가 됩니다. 
따라서 이 문자열이 "dE"로 끝나는 가장 긴 문자열이며, "AbCdE"를 return 합니다.

"AAAAaaaa"에서 "a"는 총 네 번 등장하며 이 중 가장 마지막에 있는 위치까지 잘라내면 "AAAAaaaa"가 됩니다.
따라서 이 문자열이 "a"로 끝나는 가장 긴 문자열이며, "AAAAaaaa"를 return 합니다.

 

저의 풀이!

function solution(myString, pat) {
    return myString.slice(0, myString.lastIndexOf(pat) + pat.length);
}

console.log(solution('AbCdEFG', 'dE'));

 

 

메모

일단 문자열 pat이 포함된 가장 마지막 index를 포함해서 slice를 해줍니다. 이때 주의할 점은 마지막인덱스지만, 
pat 이 포함되는 글씨여야하기때문에 pat.length까지 포함해서 글씨를 잘라주어야 
정확한 출력이 됩니다.

 

 

 

문제 96.  간단한 논리 연산자


문제 설명

boolean 변수 x1, x2, x3, x4가 매개변수로 주어질 때,
다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.

(x1 ∨ x2) ∧ (x3 ∨ x4)


 

입출력 예

x1 x2 x3 x4 result
false true true true true
true false false false false

 

 

입출력 예 설명

예제 1번의 x1, x2, x3, x4로 식을 계산하면 다음과 같습니다.
(x1 ∨ x2) ∧ (x3 ∨ x4) ≡ (F ∨ T) ∧ (T ∨ T) ≡ T ∧ T ≡ T
따라서 true를 return 합니다.


예제 2번의 x1, x2, x3, x4로 식을 계산하면 다음과 같습니다.
(x1 ∨ x2) ∧ (x3 ∨ x4) ≡ (T ∨ F) ∧ (F ∨ F) ≡ T ∧ F ≡ F
따라서 false를 return 합니다.

 

 

저의 풀이!

function solution(x1, x2, x3, x4) {
    return (x1 || x2) && (x3 || x4);
}

console.log(solution(false, true, true, true));

 

 

메모

wow... 이부분은 이해가 안되서 찾아봤습니다. 
도대체가 v라는 연산자가 뭐가있을까 수학을 까먹었더라도 연산자가 기억안나지는 않을텐데하고...
근데 그거는 그저 표시해주는 도형같은 것일 뿐이였고,
따로 아래에 표시된 진리표를 봤을때, 
x,y가 같을때와 다를때 v 가 있으면 뭐가나타나는지 ∧이거라면 뭐가 나타나는지
그거에대한 연산자를 알면.. 할 수 있는 풀이였습니다.
문제를 조금 더 이해하는 시간이 필요했던 것 같은 아쉬움이 남습니다 ㅜㅜ 

 

 

문제 97.  배열의 길이을 2의 거듭제곱으로 만들기


문제 설명

정수 배열 arr이 매개변수로 주어집니다. 
arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. 
arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.

 

 

입출력 예

arr result
[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6, 0, 0]
[58, 172, 746, 89] [58, 172, 746, 89]

 

입출력 예 설명

예제 1번의 arr의 길이는 6입니다. 
arr의 길이를 2의 정수 거듭제곱으로 만드는 방법은 0을 2개, 10개, 26개,..., 추가하는 방법이 있고 그중 최소한으로 0을 추가하는 방법은 2개를 추가하는 것입니다. 따라서 [1, 2, 3, 4, 5, 6, 0, 0]을 return 합니다.

예제 2번의 arr의 길이는 4이고 이미 2의 정수 거듭제곱입니다. 
따라서 뒤에 0을 추가하지 않아도 되므로 [58, 172, 746, 89]를 return 합니다.

 

저의 풀이!

function solution(arr) {
    // 제한사항이 1000 아래 숫자라서 2의 9승까지밖에 안됨
    const pow2 = [0, 2, 4, 8, 16, 32, 64, 128, 256, 512];

    let idx;
    for (let i = 0; i < pow2.length; i++) {
        if (arr.length < pow2[i]) break;
        idx = pow2[i];
    }
    const zeroArray = Array(idx).fill(0);

    return [...arr, ...zeroArray.slice(0, idx - arr.length)];
}
 

 

 

메모

이부분은 어려웠습니다요 .. 선생님의 도움을 받아서 풀었습니다.
일단 제한사항이 1000아래 숫자라서 2의 9승까지밖에 안되는 점을 생각해서 새 배열을 만들어놓고
저배열을 순회하면서 arr.length를 비교하여 그만큼을 0으로 채워주는 식으로 풀이했습니다.

 

다른방법도 알려주었습니다.

이게조금더 이해하기 쉬울겁니다.

 

function solution1(arr) {
    let idx = 0;
    let arrLength = arr.length;
    while (true) {
        const number = 2 ** idx;
        if (arrLength > number) {
            idx++;
        } else {
            for (let i = 0; i < number - arrLength; i++) {
            arr.push(0);
            }
            return arr;
        }
    }
}
 
console.log(solution1([1, 2, 3, 4, 5, 6]));

 

 

 
Comments