Breaking

2018년 12월 30일 일요일

Baekjoon 10809번 python 알파벳 찾기

Baekjoon 10809번 알파벳 찾기 python



https://www.acmicpc.net/problem/10809

첫 시도

getStr=input()
alp=[]
number=[]
for i in range(ord('z')-ord('a')+1):
    num = ord('a')+i
    alp.append(chr(num))
    number.append(-1)
"""
alp='a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
number=[-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]

"""
for i in range(len(getStr)):
    for j in range(len(alp)):
        if getStr[i] == alp[j]:
            if number[j] == -1:
                number[j]=i

printStr=''
for i in range(len(number)):
    printStr += str(number[i])+' '
    
print(printStr)


우선 각 입력문자에 맞게 조건을 걸고싶어서 alp와 number를 list 형태로 정렬한 후
입력받은 문자 순서에 맞게 비교 정렬하는 과정을 거쳐 마지막에는 string으로 나열해서 출력했다.

그러나 이 방식을 가만히 생각해보면 리소스 소모가 매우 크다는 사실을 알 수 있다.
겨우 단어 한개때문에 알파벳을 전부다 돌아야하는 for문을 2번쓰는 것이 메모리를 낭비하게한다. 때문에 하다보니 생각하게된 dictionary 형태가 더 편하다는 생각을 하게 되었고

Dictionary에 맞게 정돈하면 다음과 같다.

getStr = input() 
alp = {chr(i):-1 for i in range(ord('a'), ord('z')+1)} 
for i in range(len(getStr)): 
     if alp[getStr[i]] == -1:
            alp[getStr[i]] = i
for key in sorted(alp.keys()): 
    print(alp[key], end=' ') 

리소스가 훨씬 줄어들고 코드 길이 역시도 많이 줄은 것을 확인할 수 있다.

더욱이 여기서는 print(alp[key], end=' ')를 통해 굳이 string으로 만들지 않고도 나열할 수 있는 방법을 알아냈다.

결론


1. 단어별 숫자를 찾거나 횟수, 위치를 찾는 방식에는 Dict 형태가 list 2개보다 훨씬 좋다.
2. print(~, end=' ')를 통해 끝 부분을 개행문자인 \n이 아닌 다른 방식을 추가하여 나열할 수 있는 법을 알 수 있다.
3. ord(char), chr(Ascii_number)를 잘 사용해서 dict만들기가 가능하다.


ALL RIGHT RESERVED TWINSTARINFO