🔗 문제 링크
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))
'PS > 백준(BOJ)' 카테고리의 다른 글
[백준] 괄호(9012) - 파이썬(Python) (0) | 2024.03.18 |
---|---|
[백준] 스택 2(28278) - 파이썬(Python) (0) | 2024.03.12 |
[백준] 소수(2581) - 파이썬(Python) (1) | 2024.03.10 |
[백준] 달팽이는 올라가고 싶다(2869) - 파이썬(Python) (0) | 2024.03.08 |
[백준] 단어 공부(1157) - 파이썬(Python) (1) | 2024.03.06 |