Post

[SWEA] 7675. 통역사 성경이 (python)

📌문제

Alt text

💪아이디어

처음에는 re를 사용하여 알고리즘을 작성했는데 SWEA에서는 import re를 사용할 수 없었다.

  1. 입력값 다 받기

    처음에는 입력값이 주석떄문에 행나눠서 제시된줄 알아서 input()으로 입력값을 받았는데 테스트케이스에서 자꾸 런타임에러가 떴다. 행이 나뉜채로 문장이 입력되는 테스트케이스가 있었다. .,!,?이 문장을 나뉘는 기준이었기 때문에 while문을 돌리면서 .,!,?의 총합이 n과 같으면 입력을 멈추는 것으로 해결했다.

  2. 문장 나누기

    입력된 문장들을 공백으로 나누면 word 단위로 문자열이 나뉜다. 문장별로 이름의 개수를 세야하기 때문에 word에 .,!,?가 있으면 그 단어까지의 이름의 개수를 출력하고 이름의 개수를 초기화한 후 다시 세도록 하였다.

    re를 사용하면 다음과 같다
1
word_li=re.split('[.?!] *',문장리스트)

re.split(‘패턴’,문자열)
[ ]:이 안에 있는 문자가 하나라도 있어야함
*: 앞 문자나 숫자가 0개 이상 있어야함

  1. 이름인지 판단하기

    이름의 조건은
    • 맨 앞글자는 대문자이어야함
    • 숫자가 포함X
    • 맨 앞글자를 제외한 모든 알파벳은 소문자이어야함
1
2
pattern=re.compile('[A-Z][a-z]*')
if re.fullmatch(pattern,word): num+=1

fullmatch: 문자열의 앞에서 끝까지 패턴과 일치하면 object반환 else return None

🥂코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def name_chk(word):
    for i,ch in enumerate(word):
        if i==0 and ('A'>ch or 'Z'<ch): return False
        if ch.isdigit(): return False
        if i>0 and 'A'<=ch<='Z': return False
    return True

T = int(input())
for i in range(1,T+1):
    n = int(input())
    num,sentence_chk=0,False
    sentnece_num=0
    word_li=''
    while True:
        li=input()
        if sentnece_num==0: word_li+=li
        else: word_li+= ' '+li
        sentnece_num+=li.count('.')+li.count('!')+li.count('?')
        if sentnece_num==n: break
    print('#{}'.format(i),end=' ')
    for word in word_li.split():
        if word[-1] in '.?!': 
            word = word[:-1]
            sentence_chk=True
        if name_chk(word): num+=1
        if sentence_chk: 
            print(num,end=' ')
            num=0
            sentence_chk=False
    print()
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.