코딩 문제

백준 더하기 사이클, 크로아티아 알파벳

토리쟁이 2022. 7. 5. 12:03

 

#방법1
N=input()
l=list(map(int, N))
N=int(N)
a=N
cnt=0
sum=0
while(True):
    if N>=10:
        sum=int(l[0]+l[1])
        sum=sum%10
        new=int(str(l[1])+str(sum))
        N = new
        l=list(map(int, str(new)))
        cnt=cnt+1
    else:
        new=int(str(N)+str(N))
        N=new
        l=list(map(int, str(new)))
        cnt=cnt+1

    if a==new:
        break

print(cnt)

위의 방법1은 내가 처음 이 문제를 풀었던 방법이다.

그냥 문제에서 주어진대로 각 자릿수를 쪼개어 더하고, 리스트에 넣기도 하고..

좀 더럽지만 정석대로 풀었다.

 

아래의 방법2는 다른 사람의 코드를 보고 다시 코드를 짜봤다.

같은 문제인데 길이가 확연하게 다르다.

 

문제에 너무 집중하기보다는, 규칙성이나 문제 해결에 좀 더 집중해야 이러한 코드 작성이 가능해질 것 같다.

 

#방법2
a=int(input())
result=a
count=0
while True:
    ten=a//10
    one=a%10
    sum2=ten+one
    count=count+1
    new2=int(str(one)+str(sum2%10))
    a=new2

    if(result==new2):
        break
print(count)

이 방법2는 각 자릿수를 쪼개고, 필요한 부분만 바로바로 빼다 썼다.

몇 시간동안 매달렸던 문제였지만, 결국 스스로 못풀어냈다.

접근 방법은 비슷했지만, 알고리즘을 적용할 위치에 따라서 불필요한 코드들을 제거할 수 있는데, 

너무 뒤에서 써서 앞에 불필요한 잔코드들이 많았다. 답도 틀렸고..이건 왜인지 모르겠음

 

일단 정답 코드는

그냥 두면 나중에 해석 못할까봐 주석을 적은 코드를 아래에 작성하였다.

import sys
a=sys.stdin.readline().strip()
c=['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z='] #크로아티아로 변경가능한 알파벳을 리스트에 저장
result=0 #결과값을 반환할 변수

for i in c: #크로아티아로 변경가능한 문자열을 반복문으로 하나씩 넣어보기
    a=a.replace(i, '*') #입력받은 문자열에 해당 크로아티아로 변경가능한 문자열이 있다면, 해당 문자열을 임의의 한 문자로 변경해주기
    #=> 그래야 갯수를 셀 때, 하나로 치고 셀 수 있음
print(len(a))

보통 문자열에서 특정 문자를 제거하기 위해서는 .replace("제거할 문자", "") 이러한 형태로 많이 쓰는데

이 문제에서는 "*"가 아닌 ""를 쓰면 오답이 나온다.

3번 예시인 nljj를 보면 크로아티아 문자를 모아둔 리스트를 반복문을 돌면서 해당 문자열에 크로아티아 문자가 있을 경우  replace하게 되는데, 이 때 ""를 써버리면 lj를 삭제하여 nj만 남게 되고, nj가 다시 크로아티아 알파벳에 해당되기 때문이다.
원래는 크로아티아 알파벳이 아닌데 크로아티아 알파벳으로 인식하게 되어 오답이 나오는 것이다.

대부분은 ""를 쓰지만, 경우에 따라 "*"를 씀으로써, 제약을 걸어야되는 경우도 잊지 말자. 

그리고

*replace를 쓴다고 해도 원래 문자열은 바뀌지 않기 때문에, 반드시 replace사용 후 변수에 담아줘야 문자열이 바뀐다.*

 

그리고 아래는 내가 시도했던 방법.

해당 단어가 나오면 지워주는 알고리즘을 너무 뒤에 써서 앞에 잔 코드들이 많다.

예제 샘플 넣었을 땐 다 잘나왔는데 일단 답이 틀림.. 어디서 로직이 하나 잘못된듯

 

그리고 정답 코드와 비교해보면, 해당 문자가 나오면 삭제하는 로직에서

a.replace(i, '')이렇게 삭제하고 카운트를 별도로 셌는데

어차피 그 문자는 크로아티아 알파벳 하나로 치니까 임의의 문자 *하나를 넣어서

아예 문자 길이 셀 때 카운트도 같이 셀 수 있게 해야 더 좋은 코드..

 

a=a.replace(i, "*")

앞으로 잘 활용해야지