[BOJ] 10808: 알파벳 개수

이슬비·2022년 4월 29일
0

Algorithm

목록 보기
30/110

오늘 문제도 SOSO였다. 되게 여러 풀이 방법이 있는 것 같은데 일단 나는 2가지 방법으로 풀어봤다.

10808: 알파벳 개수

1. 첫 번째 풀이: 성공

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] 값만큼으로 바꾸어준다.

2. 두 번째 풀이: 성공

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를 쓴 게 시간이 덜 걸렸다. 정말 알다가도 모를 컴퓨터이다...

3. 세 번째 풀이: 성공

일단 결론은... 시간을 더 썼다 ^^....

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=" ")

이 풀이는 아스키코드에 대해서 어느정도 인지와 암기를 하고 있다고 생각하고 풀이한 것이기 때문에... 사실 좋은 풀이는 아닌 것 같다.

4. 다른 풀이

사실 이 풀이 보고 내가 지금 뭘한걸까 ~ 라는 생각을 엄청 많이 했다. 아니 그냥 코드 딱 보고 내가 문제 번호를 잘못 검색했나라는 생각을 할 정도로 짧은 코드였다 ㅋㅋ..
(출처: 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)을 두고 출력

다섯 줄이면 된다고...? 심지어 시간도 내가 풀었던 첫 번째, 세 번째 방법보다 빨랐다...^^

역시 많이 알아도 진짜 어떤 게 유용할지는 계속 고민해보고, 어려운 게 항상 정답은 아니란 것을 항상.. 기억해야 하는 것 같다.

오늘도 신기한 알고리즘의 세계 끝!

profile
정말 알아?

0개의 댓글