알고리즘🅰/프로그래머스

[프로그래머스] 문자열 내 p와 y의 개수

개발조각 2022. 2. 17. 18:13
728x90
반응형

이번 문제는 쉬운 편에 속하는 것 같아요.

프로그래머스에서 반복문은 항상 for문만 썼는데 이번에는 while문을 써서 풀어보았고

함수로 담는게 더 깔끔한 것 같아서 함수를 만들어보았습니다.

 


해결방안

function solution(s){
    let lcs = s.toLowerCase();
    
    function countChar(char){
        let count = 0;
        let pos = lcs.indexOf(char);
        
        while(pos !== -1){
            count++;
            pos = lcs.indexOf(char, pos + 1);
        }
        return count;
    }
    return countChar('p') === countChar('y') ? true : false;
}

해결방안 순서

  1. 대문자와 소문자가 섞여있는 문자열 s를 소문자로 바꾸기
  2. 문자열 s에서 어떠한 알파벳이 몇 개인지 카운트하기
  3. s문자열에서 p와 y의 갯수가 같으면 true, 아니면 false 반환하기

 

1단계. 대문자와 소문자가 섞여있는 문자열 s를 소문자로 바꾸기

toLowerCase()메서드를 사용해서 대소문자가 섞여있는 문자열 s를 소문자로 바꾸어 주었습니다.

MDN Web Docs
toLowerCase() 메서드는 문자열을 소문자로 변환해 반환합니다.

구문 : str.toLowerCase()

// toLowerCase()메서드 예제
const sentence = 'The quick brown fox jumps over the lazy dog.';
console.log(sentence.toLowerCase()); // "the quick brown fox jumps over the lazy dog."

 

테스트 1 (s = "pPoooyY")
let lcs = s.toLowerCase(); -> "ppoooy"

테스트 2 (s = "Pyy")
let lcs = s.toLowerCase(); -> "pyy"

 

2단계. 문자열 s에서 어떠한 알파벳이 몇 개인지 카운트하기

여기서는 1단계에서 구한 lcs의 문자열을 가지고 특정 알파벳이 몇 개인지 구하는 함수를 만들어보았습니다.

// 2단계. 문자열 s에서 어떠한 알파벳이 몇개인지 카운트하기
function countChar(char){
    let count = 0;
    let pos = lcs.indexOf(char);

    while(pos !== -1){
        count++;
        pos = lcs.indexOf(char, pos + 1);
    }
    return count;
}
  • let count = 0; : 특정 알파벳이 몇개인지 카운터 해주는 변수
  • let pos = lcs.indexOf(char); : 문자열 lcs에서 특정 문자(변수 : char) 값과 일치하는 첫 번째 인덱스를 반환
  • while(pos !== -1) : pos가 -1이 아닐 때까지 반복

2단계에서는 indexOf()메서드와 while()문을 사용하여 lcs의 문자열을 가지고 특정 알파벳이 몇 개인지 구하었습니다.

MDN Web Docs
String.prototype.indexOf()
indexOf() 메서드는 호출한 String 객체에서 주어진 값과 일치하는 첫 번째 인덱스를 반환합니다. 일치하는 값이 없으면 -1을 반환합니다.

구문 : str.indexOf(searchValue[, fromIndex])

  • searchValue :찾으려는 문자열. 아무 값도 주어지지 않으면 문자열 "undefined"를 찾으려는 문자열로 사용합니다.
  • fromIndex Optional : 문자열에서 찾기 시작하는 위치를 나타내는 인덱스 값입니다. 어떤 정수 값이라도 가능합니다. 기본값은 0이며, 문자열 전체를 대상으로 찾게 됩니다. 만약 fromIndex 값이 음의 정수이면 전체 문자열을 찾게 됩니다. 만약 fromIndex >= str.length 이면, 검색하지 않고 바로 -1을 반환합니다. searchValue가 공백 문자열이 아니라면, str.length를 반환합니다.
// String.prototype.indexOf() 예제
const s = "ppoooy"
console.log(s.indexOf("p")); // 0
console.log(s.indexOf("o")); // 2
console.log(s.indexOf("y")); // 5
console.log(s.indexOf("p", 1)); // 1
console.log(s.indexOf("p", 2)); // -1

여기서 중요한 점은 "일치하는 값이 없으면 -1을 반환합니다."는 점입니다.

이 점을 이용하여 특정 알파벳이 몇개인지를 구할 수 있습니다.

 

참고로 제가 저 방법을 생각한 이유가 MDN에서 "indexOf()를 사용하여 문자열 내의 특정 문자 숫자 세기"예제가 있어서 고거 그대로 썼습니다. 😁

// 아래 예제는 str 문자열에서 e 문자의 총 숫자를 확인하는 프로그램입니다:
var str = 'To be, or not to be, that is the question.';
var count = 0;
var pos = str.indexOf('e'); //pos는 4의 값을 가집니다.

while (pos !== -1) {
  count++;
  pos = str.indexOf('e', pos + 1); // 첫 번째 e 이후의 인덱스부터 e를 찾습니다.
}

console.log(count); // 4

 

세부적으로 어떻게 돌아가는지에 대해 테스트 1로 설명하자면

s = "pPoooyY";
1단계 let lcs = "ppoooy";

 

char = p;이면

let count = 0;
let pos = lcs.indexOf(char); -> let pos = lcs.indexOf(p); : 0

while(pos !== -1) : pos가 -1이 아닐 때까지 반복

count++; -> count = 1
pos = lcs.indexOf(char, pos + 1); -> lcs.indexOf("p", 0 + 1); -> lcs.indexOf("p", 1); : 1

 

while문을 실행한 뒤 let pos = 1

while(pos !== -1)

count++; -> count = 2
pos = lcs.indexOf(char, pos + 1); -> lcs.indexOf("p", 1 + 1); -> lcs.indexOf("p", 2); : -1

 

while문을 실행한 뒤 let pos = -1

while(pos !== -1)

pos = -1임으로 while문 실행 안 함

count = 2

 

이문제에서 단순히 하나의 알파벳만 세는 것이 아니라 p, y 2개의 알파벳이 몇 개인지를 세어야 됨으로

p를 넣어야 되는 위치에 char를 넣어 함수로 따로 만들어 주었습니다.

 

테스트 1 (s = "pPoooyY")
단계 1. let lcs = "ppoooy"
countChar('p') = 2
countChar('y') = 1

테스트 2 (s = "Pyy")
단계 1. let lcs = "pyy"
countChar('p') = 1
countChar('y') = 2

 

3단계. s문자열에서 p와 y의 개수가 같으면 true, 아니면 false 반환하기

마지막으로 lcs문자열에서 p와 y의 갯수가 같으면 true, 아니면 false 반환해야 되는데

2단계에서 "특정 문자 숫자 세기"를 하는 함수를 만들었으므로 이걸 이용해서 삼항 연사를 사용하여 p와 y의 개수가 같은지 안 같은지를 나타내 주었습니다.

// 3단계. s문자열에서 p와 y의 갯수가 같으면 true, 아니면 false 반환하기
return countChar('p') === countChar('y') ? true : false;

삼항 연산자

구문 : 조건 ? true : false

  • 조건이 true이면 true를 실행
  • 조건이 false이면 false를 실행
테스트 1 (s = "pPoooyY")
단계 1. let lcs = "ppooyy"
countChar('p') = 2
countChar('y') = 2
countChar('p') === countChar('y') ? true : false; -> 2 === 2 ? true : false; -> 조건이 true임으로 true 반환

테스트 2 (s = "Pyy")
단계 1. let lcs = "pyy"
countChar('p') = 1
countChar('y') = 2
countChar('p') === countChar('y') ? true : false; -> 3  === 2 ? true : false; -> 조건이 false임으로 false 반환

여기까지 프로그래머스 문자열 내 p와 y의 개수 해결방안에 대해 설명해보았습니다.

728x90
반응형