1차 공부/알고리즘

문자열 내 p와 y의 개수

공대탈출 2022. 11. 23. 12:31
문제 설명
대문자와 소문자가 섞여있는 문자열 s가 주어집니다.
s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요.
'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

 

제한 조건
문자열 s의 길이 : 50 이하의 자연수
문자열 s는 알파벳으로만 이루어져 있습니다.

 

 

function solution(s){
    var answer = true;
    let parr = [];
    let yarr = [];
    //s를 배열로 일시적 승급해 소문자로 바꾼뒤, 문자별로 나누어 배열로 저장한다.
    let a = s.toLowerCase().split('')
    //인덱스가 0부터 s의 길이까지 (a.length써도 됨.)
    for (i=0; i<s.length; i++){
        //만약 i번째 인덱스 요소가 'p'라면
        if (a[i]==='p') {
            //parr에 'p'를 push한다.
            parr.push('p')
        }
        //만약 i번째 인덱스 요소가 'y'라면
        if (a[i]==='y') {
            //yarr에 'y'를 push한다.
            yarr.push('y')
        }
    }
    //만약 parr과 yarr의 길이가(p와 y의 갯수가) 같다면
    if (parr.length === yarr.length) {
        //true를 반환한다.
        answer = true
    //만약 parr과 yarr의 길이가 다르다면
    } else {
        //false를 반환한다.
        answer = false
    }
    return answer;
}

간단하게 for문과 if문을 사용해 적절한 boolean값을 반환하도록 하였다.

 

 

function solution(s){

    return [...s.toLowerCase()].reduce((acc, cur) => {
        if(cur ==='p') return acc + 1;
        else if(cur ==='y') return acc - 1;
        return acc;
    }, 0) ? false : true;
}

답을 제출하고 본 다른사람의 풀이이다.

 

s.toLowerCase() = s를 일시적으로 배열로 승급하여 요소마다 소문자로 변경한다.

[...s] = 소문자화 한 것을 배열화 시킨다. / 뒤에 .split('')을 쓰는 것과 똑같다.

 

reduce문 =

if (cur==='p') return acc +1; = 만약 현재비교대상인 s배열의 값이 'p'라면, acc에 1을 더해준다.

else if (cur === 'y') return acc -1; = 만약 현재 비교대상인 s배열의 값이 'y'라면, acc에서 1을 뺀다.

마지막으로 acc를 반환해준다.

초기값은 0부터...

 

~~ ? false : true; = 만약 s배열의 값을 모두 비교했을때 acc에 저장된 값이

0이라면('p'의 개수와 'y'의 개수가 같다면) 0은 falsy하기 때문에 true를 반환하고

0이 아니라면('p'의 개수와 'y'의 개수가 다르다면) 0이아닌 숫자는 truthy하기 때문에 false를 반환한다.

 

뭔가 가독성이 떨어지는 것 같지만, 알고리즘 풀이를 위해 저장해 보았다.

reduce는 굉장히 효율이 좋은 문장같아 잘 알아두도록 해야겠다.

'1차 공부 > 알고리즘' 카테고리의 다른 글

서울에서 김서방 찾기  (0) 2022.11.23
문자열 다루기 기본  (0) 2022.11.23
내적  (0) 2022.11.23
나누어 떨어지는 숫자 배열  (0) 2022.11.23
2016년  (0) 2022.11.23