오늘 풀어본 문제들 중 하나인데 문제 자체는 정말 쉬웠다.
// 내 풀이
func solution(_ s:String) -> Bool
{
var pCnt = 0, yCnt = 0
var ans:Bool = false
for i in s {
if i == "p" || i == "P" {
pCnt = pCnt + 1
} else if i == "y" || i == "Y" {
yCnt = yCnt + 1
}
}
if pCnt == yCnt {
ans = true
}else {
ans = false
}
return ans
}
// 인상적인 풀이
import Foundation
func solution(_ s:String) -> Bool
{
let string = s.lowercased()
return string.components(separatedBy: "p").count == string.components(separatedBy: "y").count
}
내 풀이와 밑에 인상적인 풀이가 있는데 내 풀이는 그냥 기본이기 때문에 설명은 생략하고, 다른 사람이 푼 것을 좀 분석해 보았다. 우선 문자열 s를 p나 P y나 Y일 경우를 따져야 하기 때문에 경우를 줄이고자 전부 lowercased() 메소드를 통해 소문자로 바꾼뒤, components()라는 메소드를 통해서 문자열 s를 소문자로 바꾼 string 에서 p 혹은 y만을 모은 배열을 만들어 그 배열의 갯수(count)를 비교하여 리턴하고 있는 것이었다.
components(seperatedBy:) 주어진 집합의 문자로 나누어진 문자열의 부분 문자열을 포함하는 배열을 반환합니다.
또 이 풀이도 인상깊었다.
// 인상적인 풀이 2
import Foundation
func solution(_ s:String) -> Bool
{
return s.lowercased().filter { $0 == "p" }.count == s.lowercased().filter { $0 == "y" }.count
}
기존에 알고있던 filter메소드를 통해 문자열 s의 문자 하나하나가 들어올 때마다 p나 y와 같을 경우를 필터링 하는 것인데 저 뒤에 count가 붙는 것을 처음 알았다... 😬