코딩 테스트 & 문제 해결/코딩 테스트 연습

[BOJ] [python] 2941: 크로아티아 알파벳

JYUN(sia) 2024. 12. 23. 01:40

코드1

오류1: 문자열은 Python에서 불변 객체(immutable)

croba=['c=','c-','dz=','d-','lj','nj','s=','z=']

word=input()
answer=0

for x in croba:
    if str(x) in word:
        word.replace(str(x),'')
        answer+=1
print(word)
print(answer)

 

ljes=njak
3

 

croba=['c=','c-','dz=','d-','lj','nj','s=','z=']

word=input()
answer=0

for x in croba:
    if str(x) in word:
        print(str(x))
        new_word=word.replace(str(x),'')
        answer+=1
print(new_word)
print(answer)
lj
nj
s=
ljenjak
3

 

croba=['c=','c-','dz=','d-','lj','nj','s=','z=']

word=input()
new_word=word
answer=0

for x in croba:
    if str(x) in word:
        new_word=new_word.replace(str(x),'')
        answer+=1
answer+=len(new_word)
print(answer)

 

예제 문제를 모두 통과하나 싶었지만 틀린 출력을 발견하였다.

 

오류2: 같은 문자 중복찾기 불가

 

입력 문자열에서 리스트 안에 있는 타겟단어만 찾다보니까 예제 입력4같은 상황에서 'c=' 하나만 더하는 에러가 발생하였다.

croba=['c=','c-','dz=','d-','lj','nj','s=','z=']

word=input()
new_word=word
answer=0

for _ in range(len(word)):
    for target in croba:
        if str(target) in new_word:
            length = len(str(target))
            word_list=list(new_word)
            for i in range(length):
                word_list[i]=''
            answer+=1
            new_word=''.join(word_list).strip()
answer+=len(new_word)
print(answer)

croba 리스트에 있는 타겟 문자열을 찾으면 제거하는 플로우로 코딩해서 예제 문제는 모두 맞췄지만 틀렸다

이런상황이 진짜 에러 찾기 힘든 것 같다.

 

dz=dz=

output: 3 (dz=, d, z=)
answer: 2 (dz=, dz=)

질문게시판을 뒤지다가 반례를 찾았다.

너무 비효율적인 코드라고는 생각했는데 dz=과 z=를 제대로 찾으려면 검사하는 크로바티아 알파벳의 범위를 하나씩 늘려가며 찾아야겠다.

croba=['c=','c-','dz=','d-','lj','nj','s=','z=']
croba_2=[]
croba_3=[]

for croba_alpha in croba:
    if len(croba_alpha)==2:
        croba_2.append(croba_alpha)
    if len(croba_alpha)==3:
        croba_3.append(croba_alpha)

word=input()
new_word=word
answer=0
for _ in range(len(new_word)):
    for x in croba_3:
        if str(x) in new_word:
            length = len(str(x))
            word_list=list(new_word)
            for i in range(length):
                word_list[i]=''
            answer+=1
            # print(word_list)
            new_word=''.join(word_list).strip()
            # new_word=str(new_word)
            # print("new_word: ",new_word,"x: ",x)
            # print("answer: ",answer)
for _ in range(len(new_word)):    
    for y in croba_2:
        if str(y) in new_word:
            length = len(str(y))
            word_list=list(new_word)
            for i in range(length):
                word_list[i]=''
            answer+=1
            new_word=''.join(word_list).strip()
            # print("newword: ",new_word,"y: ",y)

# print(new_word)
answer+=len(new_word)
print("answer:", answer)

여기까지 가다가.. 도저히 안될거같아서 코드 갈아엎기 start ㅠㅠㅜ

 

 


코드2

croba = ['c=', 'c-', 'z=', 'd-', 'lj', 'nj', 's=', 'dz=']
word = input()
answer = 0
i = 0

while i<len(word):
    flag=0
    for alpha in croba:
        if word[i:i+len(alpha)]==alpha:
            answer+=1
            flag=1
            i+=len(alpha)
            break
    if flag==0:
        answer+=1
        i+=1
print(answer)

 

결국 완전히 다른 방향으로 접근해서 풀었다.

저 코드에서도 break없이는 시간초과가 뜨는 걸 보니 어차피 원래 접근방식으로는 못 풀었을 것 같다

보다 효율적인 코드를 작성하는 법, 문자열에서 인덱스를 다루는 법을 더 공부해야겠다