오늘 문제도 SOSO였다. 되게 여러 풀이 방법이 있는 것 같은데 일단 나는 2가지 방법으로 풀어봤다.
import sys
from collections import Counter
word = sys.stdin.readline().strip()
alpha = [chr(i) for i in range(97, 123)]
word_key = list(Counter(word).keys())
word_value = list(Counter(word).values())
result = [0]*len(alpha)
for i in range(len(word_key)):
index = alpha.index(word_key[i])
result[index] = word_value[i]
for i in range(len(result)):
print(result[i], end=" ")
첫 번째 풀이는 Counter을 이용해보았다. 처음에는 당연히 count 함수를 쓰려고 했는데, 저번에 count 쓰고 쓰라린 경험을 한 이후, Counter을 이용해보자... 해서 이렇게 풀어봤다. 문제 풀 때 정신이 조금 다른 데 가있어서 되게 복잡하게 푼 것 같기는 하다.
word = sys.stdin.readline().strip()
alpha = [chr(i) for i in range(97, 123)]
word_key = list(Counter(word).keys())
word_value = list(Counter(word).values())
result = [0]*len(alpha)
먼저 단어를 sys를 통해 받아준다. 그 후에 알파벳(a to z)의 배열을 만들었다. word에서 단어를 세어주어야 하므로 Counter을 이용해서 갯수를 세어준 후 key와 value를 구분해주었다. 마지막으로는 각각의 개수를 세어줄 result까지 선언!
for i in range(len(word_key)):
index = alpha.index(word_key[i])
result[index] = word_value[i]
for i in range(len(result)):
print(result[i], end=" ")
다음으로는 result의 값을 변경하기 위해 for문을 돈다. 지금 생각해보니 왜 저렇게 복잡하게 풀었나... 싶다. 방금 생각난 다른 풀이로도 풀어봐야지.
일단 word_key의 길이만큼 for문을 돌면서 word_key에 해당하는 값을 alpha에서 찾아 해당 인덱스를 추출한다. 그 후에 이 인덱스를 result에 넣어 word_value[i] 값만큼으로 바꾸어준다.
import sys
word = sys.stdin.readline().strip()
alpha = [chr(i) for i in range(97, 123)]
result = []
for i in range(len(alpha)):
result.append(word.count(alpha[i]))
for i in range(len(result)):
print(result[i], end=" ")
두 번째에서는 에라~ 모르겠다 ~ 하며 한 번 count 함수를 써봤다.
word = sys.stdin.readline().strip()
alpha = [chr(i) for i in range(97, 123)]
result = []
먼저 똑같이 word를 받아준다. 그리고 alpha 배열을 만들어준다! 여기서 chr라는 함수가 나오는데,
chr(숫자): 숫자 -> 해당 아스키코드 문자
ord(문자): 아스키코드 문자 -> 숫자
이다. (이건 안 찾아봄 미리 알고 있었음) 여튼 이를 통해서 [a, b, c, ... z]의 진짜 알파벳 배열을 만들어준다.
for i in range(len(alpha)):
result.append(word.count(alpha[i]))
for i in range(len(result)):
print(result[i], end=" ")
이제 alpha를 for문을 돌아준다. 그리고 해당 alpha[i] 값을 word에서 count 해주고 그 값을 result에 append를 해주는 것이다. 진짜 로직은 이게 훨씬 훨씬 간단하다. 그래서인지...
아래가 Counter을 쓴 거고 위에가 count를 쓴 건데 오히려 count를 쓴 게 시간이 덜 걸렸다. 정말 알다가도 모를 컴퓨터이다...
일단 결론은... 시간을 더 썼다 ^^....
import sys
from collections import Counter
word = sys.stdin.readline().strip()
word_key = list(Counter(word).keys())
word_value = list(Counter(word).values())
result = [0]*26
for i in range(len(word_key)):
index = ord(word_key[i])-97
result[index] = word_value[i]
for i in range(len(result)):
print(result[i], end=" ")
이 풀이는 아스키코드에 대해서 어느정도 인지와 암기를 하고 있다고 생각하고 풀이한 것이기 때문에... 사실 좋은 풀이는 아닌 것 같다.
사실 이 풀이 보고 내가 지금 뭘한걸까 ~ 라는 생각을 엄청 많이 했다. 아니 그냥 코드 딱 보고 내가 문제 번호를 잘못 검색했나라는 생각을 할 정도로 짧은 코드였다 ㅋㅋ..
(출처: https://youjin86.tistory.com/39)
arr=input()
cnt=[0]*26
for i in arr:
cnt[ord(i)-97]+=1
print(*cnt)
새롭게 알게 된 부분은 아래와 같다.
print(*list): list의 요소들을 공백(default)을 두고 출력
다섯 줄이면 된다고...? 심지어 시간도 내가 풀었던 첫 번째, 세 번째 방법보다 빨랐다...^^
역시 많이 알아도 진짜 어떤 게 유용할지는 계속 고민해보고, 어려운 게 항상 정답은 아니란 것을 항상.. 기억해야 하는 것 같다.
오늘도 신기한 알고리즘의 세계 끝!