본문 바로가기
알고리즘/백준 solved.ac PS

[백준][solved.ac][Silver 4][Python] 19844번 : 단어 개수 세기

by 빛밤하늘 2021. 6. 7.
반응형

밑의 링크는 백준에서의 문제 링크입니다.

 

19844번: 단어 개수 세기

첫째 줄에 “문장”을 나타내는 문자열이 주어진다. 이 문자열은 영어 소문자, 띄어쓰기, -(하이픈), '(어포스트로피)로만 이루어져 있다. 이때 띄어쓰기, 하이픈, 어포스트로피 중 어느 것도 인

www.acmicpc.net

 

 

 

 

 

 

 

 

파이썬 코드와 결과입니다.

# readline을 사용하기 위해 import합니다.
from sys import stdin

# 첫째 줄에 "문장"을 나타내는 문자열을 입력합니다.
# 맨 끝의 \n을 지워주고, 하이픈(-)을 공백으로 변경해줍니다.
string = stdin.readline().rstrip().replace('-', ' ')
# string을 공백 단위로 쪼개어 나온 단어들을 리스트 변수에 넣어줍니다.
words = string.split(' ')
# 어포스트로피가 있는 단어에서 맨 앞 부분이 c', j', n', m', t', s', l', d', qu', s'로 
# 시작하는지 판별하기 위한 튜플 변수를 만들어줍니다.
front_word = ('c\'', 'j\'', 'n\'', 'm\'', 't\'', 's\'', 'l\'', 'd\'', 'qu\'', 's\'')
# 프랑스어의 모음인 a, e, i, o, u, h를 튜플로 만들어줍니다.
vowels = ('a', 'e', 'i', 'o', 'u', 'h')
# 총 단어의 개수를 저장할 변수를 선언합니다.
# 현재 하이픈과 공백으로 쪼개어 나온 단어의 개수로 초기화합니다.
word_cnt = len(words)

# words에 있는 단어 하나마다 반복해봅니다.
for word in words:
    # 현재 단어의 맨 앞 부분이 front_word에 있는 값들 중 하나로 시작하는 경우
    if word.startswith(front_word):
        # 현재 단어의 맨 앞에 있는 어포스트로피의 인덱스를 저장하는 변수를 선언합니다.
        apo_idx = word.index("\'")
        # 현재 단어의 어포스트로피 다음 알파벳을 저장하는 변수를 선언합니다.
        apo_next = word[apo_idx+1]

        # apo_next가 모음에 속한다면
        if apo_next in vowels:
            # 단어가 1개 더 있는 경우이므로 word_cnt에 1을 더해줍니다.
            word_cnt += 1

# 총 단어의 개수를 출력합니다.
print(word_cnt)

결과

 

처음 제출했을 때는 예제에 있는 문장에서는 아무런 이상이 없는데도

런타임 에러(ValueError)가 뜨길래 도대체 어디가 이상한지 몰랐습니다.

그래서 질문 검색에 있는 항목을 보니, 어포스트로피가 한 단어의 맨 앞, 맨 뒤에 있을 수도 있고,

한 단어에 어포스트로피가 2개 이상 있는 경우를 고려하지 않아 런타임 에러(ValueError)가 발생한다고 했습니다.

 

그리고 그런 경우를 처리할 수 있는 위의 코드를 제출하니 맞았습니다 결과가 나왔습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글