[백준] 단어의 개수(1152) - 파이썬(Python)

🔗 문제 링크


https://www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net


문제 설명
▶ 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까?

제한 조건
·  문자열의 길이는 1,000,000을 넘지 않는다.
·  단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다.
·  문자열은 공백으로 시작하거나 끝날 수 있다.

 

풀이 과정


💡처음 생각해냈던 풀이 방법
1. 문자열 안에 있는 단어의 개수를 세는 word_count을 0으로 초기화하고 현재 문자가 단어의 일부인지 확인하는 is_word을 False로 초기화한다.
2. 만약 char ≠ " " 이고 not is_word 이라면
   → 공백이 아닌 상태이고 처음 단어가 나온 상태이므로 word_count+=1을 해주고 is_word를 True로 해준다.
3. 만약 char ==" " 이라면 
   → 단어 하나가 끝났다는 뜻이므로 is_word를 False로 해준다.

 

⬇️전체 코드

def solution(sentence):
    word_count=0
    is_word=False

    for char in sentence:
        if char!=" " and not is_word:
            word_count+=1
            is_word=True
        elif char==" ":
            is_word=False

 

💡 split()를 이용한 다른 풀이 방법 (1)

생각해보니 split()을 이용해서 풀면 쉬운 방법이였다!
1. 문장을 공백을 기준으로 나눈다.
2. if 공백으로 나눈 요소들 중 공백 “ ”이 아닌 빈 문자열이 있다면→ remove한다.
3. 단어의 갯수를 출력한다.

 

⬇️전체 코드

#문장을 공백을 기준으로 나눈다.
word=sentence.split(" ")

for word_blank in word:
    if word_blank=="":
        word.remove(word_blank)

print(len(word))

⇒ 하지만 이 코드는 리스트를 순회하면서 요소를 제거하면 리스트의 크기가 변경되어 인덱스에 문제가 생길 수 있다고 하였다. 또한, remove 함수는 처음 나오는 요소만 제거하기 때문에 여러 개의 빈 문자열이 있는 경우 모두 제거하지 못할 수 있다.

 

💡 split()를 이용한 다른 풀이 방법 (2)

1. sentence.split(" ")을 통해 공백을 기준으로 문자를 나눈다.
2. for word in sentence.split(" ") → 위에서 만든 리스트의 각 단어를 반복한다.
3. if word → 만약 word가 빈 문자열이 아닌 어떤 내용을 가지고 있다면 참이므로 리스트에 word를 채운다. 
    ⇒ 파이썬에서 빈 문자열은 False로 간주되며 그 외의 문자열은 다 True로 간주함

 

👩‍💻 최종 코드


sentence=" The first character is a blank"

#문장을 공백을 기준으로 나누고 빈 문자열을 제외한다.
word=[word for word in sentence.split(" ") if word]

print(len(word))