2022. 9. 27. 01:08ㆍ기록/Programmers
- 목차
문제 설명
대문자와 소문자가 섞여있는 문자열 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 answer = true;
let pCount = 0;
let yCount = 0;
s = s.toLowerCase().split('').forEach((char) => {
if (char === 'p') {
pCount++;
} else if (char === 'y') {
yCount++;
}
});
answer = pCount === yCount ? true : false;
return answer;
}
먼저 toLowerCase() 함수를 통해 문자열을 소문자로 통일하고, split 로 문자열을 쪼개어 배열의 원소로 넣어주었다.
그 후 forEach 를 통해 배열의 원소를 하나씩 꺼내어 'p' 인지 'y' 인지 구분하여 카운트를 증가시켜 주었다.
문제 설명에서 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴한다고 하였는데,
두 문자가 하나도 없는 경우 각각의 카운트가 0이기 때문에 삼항연산자의 조건식에서 true 를 반환한다.
두 문자의 갯수가 같은 경우에도 true 를 반환하고 같지 않은 경우에는 false 를 반환하게 하였다.
'p' 와 'y' 의 개수가 같으면 true,
'p' 와 'y' 의 개수가 다르면 false,
'p' 와 'y' 이 둘다 0이면 true 라는 세 가지의 조건에서
'p' 와 'y' 의 개수가 같다 === 'p' 와 'y' 이 둘다 0이다 라는 것을 이용하여
삼항 연산자를 이용하여 간결하게 세 가지의 조건을 걸러낼 수 있었다.
다른 사람의 문제 풀이
function solution (s) {
return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}
입력받은 문자열을 대문자로 통일하고, "P" 를 기준으로 문자열을 쪼개어 배열의 원소로 만든다.
똑같이 문자열을 대문자로 통일하고, "Y" 를 기준으로 문자열을 쪼개어 배열의 원소로 만들고, 두 배열의 길이가 같은지 판별하여
배열의 길이가 같다면 true, 다르면 false 를 리턴한다.
입출력 예로 예를 들어 보면,
먼저 "pPoooyY" 를 대문자로 변환하면 "PPOOOYY" 가 된다.
여기서 split("P")를 통해 "P"를 기준으로 문자열을 쪼개어 보면
"('')P('')P('OOOYY')" 이렇게 소괄호로 묶인 문자들이 배열의 원소로 들어가게 된다.
결국 "pPoooyY".toUpperCase().split("P") 는 ['', '', 'OOOYY'] 이 되고 길이가 3이 된다.
리턴되는 배열의 길이는 항상 split 에 구분자로 들어간 문자와 일치되는 개수 + 1 이 된다는 것을 이용한 코드이다.
function solution (s) {
return s.match(/p/ig).length == s.match(/y/ig).length;
}
match() 메소드와 정규표현식을 이용해 일치하는 문자들로 구성된 배열의 길이를 비교한다.
match() 메소드는 정규표현식과 일치하는 문자열이 있다면 그 첫번째 문자열과 문자열의 정보를 배열에 담아 리턴한다.
만약 일치하는 문자열이 없다면 null 을 리턴한다.
정규표현식에서 i 옵션을 사용하면 대소문자를 구별하지 않는다.
또한 g 옵션을 사용하면 일치하는 모든 문자열을 원소로 하는 배열을 리턴한다.

위의 문제 풀이에서는 대소문자를 구별하지 않고 일치하는 문자열들을 배열에 담아 리턴한다.
각 배열의 길이는 주어진 문자열과 일치하는 문자의 갯수를 의미하기 때문에 배열의 길이를 이용해 갯수가 동일한지 판별하였다.
정규표현식을 이용한 풀이는 처음 보았는데, 앞으로 특정한 문자를 찾아낼 때 매우 유용하게 사용할 것 같다.