Count Vowels
영문자로 이루어진 문자열 s가 주어졌을 때, 그중 모음의 개수를 반환하세요. 모음은 대소문자에 관계없이 a, e, i, o, u입니다. 문자 y는 모음으로 세지 않습니다.
함수
- sstring
- 스캔할 영문자 문자열
- 반환값integer
- s에서 대문자와 소문자를 모두 합한 모음의 개수
제약 조건
1 ≤ s.length ≤ 5 × 104s에는 영어 문자만 포함됩니다(a부터z까지,A부터Z까지).
예제
- 입력
- s = "Interview"
- 출력
- 4
- 설명
- 모음은
I,e,i,e입니다. 대문자I는 소문자와 똑같이 계산되므로 정답은 4입니다.
- 입력
- s = "rhythm"
- 출력
- 0
- 설명
rhythm에는a,e,i,o또는u가 없고,y는 목록에 없으므로 답은 0입니다.
후속 질문
문자열을 한 번만 읽으면서 다섯 개 모음이 각각 몇 번 나타나는지 반환할 수 있나요?
힌트
하나씩 열어 보세요. 열 때마다 조금 더 알려 줍니다.
문자를 하나씩 살펴보세요. 문자가 모음이 되는 기준은 무엇이며, 대문자로 바꾸면 답이 달라지나요?
각 문자를 검사하기 전에 소문자로 변환하세요. 그러면 열 개 대신 다섯 개의 문자와 비교하게 됩니다.
0에서 시작하는 카운터를 유지하세요. 각 문자를 소문자로 변환하고
a,e,i,o또는u이면 카운터를 1 증가시키세요.
풀이
카운터를 사용해 문자열을 한 번 읽으세요. 각 문자를 소문자로 변환하면 모음 5개를 한 번만 검사해도 대소문자를 모두 처리할 수 있습니다.
각 모음을 한 번씩 세기
핵심 아이디어
문자열을 한 번씩 순회하며 aeiouAEIOU의 열 글자를 각각 세고, 열 개의 개수를 더하세요. 각 모음은 열 글자 중 정확히 하나에 해당하므로 한 번 세어지고, 자음은 그중 어느 것에도 해당하지 않습니다.
문자열을 열 번 읽습니다. 그래도 O(n)이지만, 문자 수가 5 × 10^4개라면 한 번 순회할 때 각 문자를 한 번씩 읽는 경우보다 5 × 10^5번 비교하게 됩니다.
알고리즘
total = 0으로 설정합니다.- 열 개의 문자
aeiouAEIOU를 한 번에 하나씩 가져옵니다. - 각 문자에 대해 전체 문자열을 순회하면서 문자가 해당 문자와 일치할 때마다
total에 1을 더합니다. - 열 번의 순회가 끝나면
total을 반환합니다.
def countVowels(s):
total = 0
for vowel in "aeiouAEIOU":
total += s.count(vowel) # one pass over s for this letter
return total소문자 확인을 한 번 수행
핵심 아이디어
문자열을 한 번 읽고 각 문자가 모음인지 확인하세요. 먼저 소문자로 변환하면 I가 i로 바뀌고 자음은 자음으로 유지되므로, 열 글자가 아닌 다섯 글자와 비교하면 됩니다.
확인에는 일정한 시간이 걸립니다. switch, 집합 조회 또는 문자열 aeiou에서의 검색을 사용할 수 있습니다. 각 문자를 한 번씩 읽고 카운터 하나만 저장하므로 시간은 O(n), 공간은 O(1)입니다.
알고리즘
count = 0으로 설정합니다.- 문자열을 한 번에 한 문자씩 순회합니다.
- 문자를 소문자로 변환합니다.
a,e,i,o또는u이면count에 1을 더합니다.count를 반환합니다.
def countVowels(s):
vowels = set("aeiou")
count = 0
for ch in s:
if ch.lower() in vowels:
count += 1
return count
함정과 경계 사례
- 소문자만 확인하기.
aeiou만 비교하면Interview의 대문자I를 놓쳐 3을 반환합니다. y를 세기. 여기서는 절대 모음이 아니므로rhythm은 0을 반환합니다.- 인덱스 0을 불일치로 취급하기.
"aeiou".indexOf('a')는 0이며, 이는 일치입니다.-1인지 확인하거나, PHP에서는0 == false이므로strpos를false와 비교할 때!==를 사용하세요. - C에서 반복문의 조건식에
strlen(s)을 호출하기. 매 단계마다 문자열을 다시 훑으므로5 × 10^4개의 문자는 약2.5 × 10^9단계의 비용이 듭니다.
자주 묻는 질문3
문자열에서 모음의 개수를 어떻게 세나요?
카운터를 사용해 문자열을 한 번 순회합니다. 각 문자를 소문자로 변환하고, a, e, i, o 또는 u이면 1을 더합니다. 루프가 끝나면 카운터에 정답이 들어 있습니다.
모음 개수를 세는 시간 복잡도는 얼마인가요?
O(n)입니다. 여기서 n은 문자열의 길이이며, 각 문자는 최대 5개의 문자와 한 번씩 비교됩니다. 추가 공간은 O(1)입니다. 카운터 하나와 고정된 모음 집합만 사용하기 때문입니다.
이 문제에서 y는 모음인가요?
아니요. 영어 철자에서 y는 rhythm처럼 모음 역할을 하기도 하지만, 프로그래밍 문제에서는 거의 항상 모음을 a, e, i, o, u로 정의하며, 이 문제도 그렇습니다. 문제에 y가 포함되어 있다면 확인할 글자에 추가하세요.
비슷한 문제
같은 아이디어를 쓰는 문제입니다. 두세 개를 풀면 패턴이 몸에 익습니다.
def countVowels(s):
# 여기에 코드를 작성하세요테스트 #1
테스트 #2
인자
s = "Interview"
예상 출력
4