백준 9536. 여우는 어떻게 울지?
백준 9536. 여우는 어떻게 울지?
문자열 파싱 및 자료구조 문제
1. 간단 설명
각종 개짖는 소리 문장이 주어지고
각 동물의 울음소리가 주어진다
해당 동물의 울음소리들을 모두 제거하고 나면
여우 울음소리만 남는데, 이 울음소리를 출력하는 문제
2. 예제
1
2
3
4
5
6
7
1
toot woof wa ow ow ow pa blub blub pa toot pa blub pa pa ow pow toot
dog goes woof
fish goes blub
elephant goes toot
seal goes ow
what does the fox say?
하나의 TC에 4개의 동물과 여우가 주어짐
toot woof wa ow ow ow pa blub blub pa toot pa blub pa pa ow pow toot
라는 문자열에서
개, 물고기, 코끼리, 물개 소리를 제거하고 나면
wa pa pa pa pa pa pow
만 남는다
3. 알고리즘
C++로 시도하려 했으나 너무 복잡해져서 파이썬으로 도전함
1
2
3
4
5
1. 테스트케이스 입력받기
2. 전체 소리를 입력받아, " "를 구분자로 나눠서 저장
3. 반복을 통해 동물의 울음소리 확인
3-1. 만약 질문이 들어오면 여우 소리를 출력하고 종료
4. 여우가 아닌 다른 동물의 울음소리를 제거
4. 소스코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import sys
t = int(sys.stdin.readline()) # 줄입력 받기
# 테스트 케이스만큼 반복
for _ in range(t):
sound = list(map(str, sys.stdin.readline().split())) #여러 문자열을 한줄에 입력받아 리스트에 저장함
# 반복문을 통해 동물들의 울음소리를 확인
while True:
animal = list(map(str, sys.stdin.readline().split())) # 각 동물 소리를 저장
# 동물들의 울음 소리가 아닌 질문이 주어지면 반복 중지
if animal[0] == "what":
print(" ".join(sound))
break
# 여우가 아닌 다른 동물들의 울음소리를 제거
while animal[2] in sound:
sound.remove(animal[2])
아래는 개선한 버전
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
T = int(sys.stdin.readline())
for _ in range(T):
sound = sys.stdin.readline().split()
known_sounds = set()
while True:
line = sys.stdin.readline().strip()
if line == "what does the fox say?":
break
parts = line.split()
known_sounds.add(parts[-1])
result = [s for s in sound if s not in known_sounds]
print(" ".join(result))
1
2
- sound = list(map(str, sys.stdin.readline().split()))
+ sound = sys.stdin.readline().split()
sys.stdin.readline()
을 통해 문자열로 저장한 뒤 이를 split()
으로 쪼갠다
그런데 이미 결과는 str
리스트 이므로, map(str, ...)
은 의미가 없었음
보통 map(str, ...)
은 정수 리스트를 문자열로 바꿀때 사용한다고 함
1
2
3
s = "dog barks loudly"
print(s.split()) # ['dog', 'barks', 'loudly']
print(list(map(str, s.split()))) # ['dog', 'barks', 'loudly'] → 같은 결과
오랫만에 재활훈련겸 문자열 문제를 선택했는데 더 고생했다
아예 파이썬 훈련하는 셈 치고 파이썬을 주력으로 다시 공부해봐야겠다
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.