한땀한땀

백준 1264번 - 모음의 개수 본문

Computer Science/Algorithm

백준 1264번 - 모음의 개수

junfromkorea 2025. 3. 29. 09:59

모음의 개수

 

알고리즘 문제를 풀다 보면, 가끔은 "이게 끝이야?" 싶을 정도로 간단한 문제를 만나기도 합니다. 하지만 단순해 보이는 문제라도 더 효율적인 접근 방식을 고민해 보면, 코드 최적화에 대한 감각을 키울 수 있죠. 오늘은 백준 1264번 "모음의 개수" 문제를 풀면서, 코드 개선 과정까지 함께 살펴보겠습니다.

문제 파악

  • 주어진 문장에서 모음('a', 'e', 'i', 'o', 'u')의 개수 세기
  • 각 문자는 소문자이고, 입력되는 문장은 여러 줄로 주어지며, 줄의 끝에는 "#"이 입력되어야 종료.
  • 각 문장에서 모음의 개수를 세고, 각 줄마다 그 개수를 출력

접근 방법

문장에서 모음만을 골라서 개수를 세는 문제이므로, 다음과 같은 흐름으로 접근할 것 같습니다.

  • 입력을 한 줄씩 받아 처리
  • 문장의 마지막은 #이므로 이를 만나면 종료
  • 각 문장을 순회하며 모음의 개수를 세고 출력

첫 번째 풀이

  • 입력을 리스트에 저장한 후, 리스트를 순회하며 모음 개수를 카운트
  • if char in 모음을 사용하여 매번 리스트에서 확인 
import sys

fast_input = sys.stdin.readline
모음 = ["a", "e", "i", "o", "u"]

arr = []
while True:
    phrase = fast_input().lower().strip()
    if phrase == "#":
        break
    arr.append(phrase)

for row in arr:
    cnt = 0
    for char in row:
        if char in 모음:
            cnt += 1
    print(cnt)

 

첫 번째 풀이의 문제점

  • 불필요한 리스트를 사용하여 메모리 사용이 증가.
  • if char in 모음: 에서 리스트를 탐색하므로, 최악의 경우 O(n)의 시간복잡도를 가질 수 있다.

 

두 번째 풀이

첫 번째 풀이에서 사용한 불필요한 리스트 저장을 제거하고, set 자료구조를 활용하여 조회 속도를 O(1)로 개선해 볼 수 있을 것 같습니다.

import sys

fast_input = sys.stdin.readline
모음 = {"a", "e", "i", "o", "u"}

while True:
    phrase = fast_input().strip().lower()
    if phrase == "#":
        break
    print(sum(1 for char in phrase if char in 모음))

 

 

첫 번째 풀이와 비교하여 다음과 같은 이점을 가질 수 있었습니다.

  • 리스트를 제거하여 별도의 저장없이 바로 처리하여 메모리 사용을 절약
  • set을 사용하여 O(1) 시간 복잡도를 가진 조회 로직
  • 가독성 증가

 

이번 문제는 단순한 로직속에서도 코드 최적화를 고민할 수 있는 문제였던 것 같습니다.

처음에는 직관적인 방식으로 해결하고, 이후에는 메모리 최적화와 성능 개선을 고려하는 습관을 들이면 더욱 좋은 코드를 작성할 수 있다는 걸 알게 되었습니다.

'Computer Science > Algorithm' 카테고리의 다른 글

백준 1316번 - 그룹 단어 체커  (0) 2025.03.31
선형 탐색과 배열, 문자열의 관계  (0) 2025.03.29