프로그래머스 문제풀이 7

zitto·2023년 4월 1일
0

Algorithms

목록 보기
7/22
post-thumbnail

1.문자열 내 p와 y의 개수

문제 설명
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

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


입출력 예
s / answer
"pPoooyY" / true
"Pyy" / false

입출력 예
입출력 예 #1
'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.
입출력 예 #2
'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.


문제풀이

function solution(s){
    let p =0; //알파벳 p의 개수를 담는 변수
    let y = 0; //알파벳 y의 개수를 담는 변수
    for(let i =0; i<s.length;i++){
        if(s[i] === "p" || s[i] === "P"){
            p++;
        }else if(s[i] === "y" || s[i] === "Y"){
            y++;
        }
    }
    return p === y
}

접근방법
1.카운트해야할 것은 p와y임
2.값을 담아줄 수 있는 p와 y라는 변수생성
3.첫글자를 확인해본다.
4.첫글자가 p와 같다면 p의 카운트를 하나씩 증가시킨다.
5.소문자p 이거나 대문자p 일경우 p를 증가시킨다.
6.그게 아닌 소문자y와 대문자Y인 경우 y를 하나씩 카운트해준다.
7.만약에 p변수와 y의 변수가 같을 경우 리턴값으로 준다.

코드리팩토링

  • 문자열 전체를 소문자나 대문자로 바꾼다.
function solution(s){
    let p =0; //알파벳 p의 개수를 담는 변수
    let y = 0; //알파벳 y의 개수를 담는 변수
    s = s.toLowerCase();
    // console.log(s)
    for(let i =0; i<s.length;i++){
        if(s[i] === "p"){
            p++;
        }else if(s[i] === "y"){
            y++;
        }
    }
    return p === y
}

-> 하드코딩하여 p와 y를 선언해서 사용했음. 별로 좋지 않은방법!
객체를 이용해 어떤 데이터든 동적으로 저장하는 방법을 사용한다.
불필요한 변수를 제거한다.
존재하지 않은 데이터를 가져와서 undefined에 하나를 더하니
NaN값이 뜨는 것임

function solution(s){
    const obj={}
    s = s.toLowerCase();
    for(let i =0; i<s.length;i++){
        if(obj[s[i]] === undefined){
            obj[ s[i] ] = 0;
        }
         obj[s[i]]++;
    }
    return obj.p === obj.y
}


메소드풀이

  • 문자열을 쪼개서 배열로 만들어본다.split
function solution(s){
    s = s.toLowerCase();
    return s.split("p").length - 1 === s.split("y").length - 1
}

2.이상한 문자 만들기

문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

제한 조건
문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.


입출력 예
s return
"try hello world" "TrY HeLlO WoRlD"

입출력 예 설명
"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.


문제풀이

접근방법
1. 전체가 아닌 헬로 안에서 판단
2.공백제외하고 헬로의 에이치는 0번째
3.단어별로 인덱스를 나눔.
4.공백을 만났을 때 idx를 0으로 초기화시켜줘서
다음단어의 에이치가 0번째 인덱스를 가져올 수 있도록 만들어준다.
5.공백인지 아닌지 판단한다
6.공백아닐경우 idx를 하나씩 늘려주도록 조건문 처리
7.짝수라면 대문자 홀수라면 소문자

메소드활용하기
배열을 문자열로 만든다.
.join메소드 활용

function solution(s) {
    return s.split(" ") 
            .map(words => {
        // console.log(words)
        return words.split("")
                    .map( (letter,i)=>{
            return i % 2 === 0 
                ? letter.toUpperCase() 
                : letter.toLowerCase()
        }).join("")
    }).join(" ")
}

배열안에 배열이 들어오는 이중반복문!
try에 해당하는 인덱스값 가져오기
다음단어로 넘어갈 때 초기화가 된다.

profile
JUST DO WHATEVER

0개의 댓글