목차
문제 출처 : https://www.acmicpc.net/problem/10808
이 문제는 어려운 문제가 아니지만 방법을 모르면 귀찮은 문제라 할 수 있습니다. a부터 z까지 해당 문자가 나타날 때 1씩 더해주면 됩니다. 하지만 이렇게 문제를 푼다면 a부터 z까지 26개의 변수를 만들고, 26개의 비교문을 만들어야 합니다.
이럴 때 사용하는 방법이 앞선 포스트에서 배웠던 ord를 이용하여 문자를 숫자로 바꿔주는 방법 입니다. 문자를 숫자로 바꿔서 무엇을 할 수 있을까요? 바로 리스트의 인덱스로 사용하는 것입니다.
문제 이해하기
문자 a를 숫자 0으로 바꿔줄 수 있다면 리스트의 0번째 인덱스로 사용이 가능합니다. 마찬가지로 z를 숫자 25로 바꿔줄 수 있다면 리스트의 25번째 인덱스로 사용이 가능하게 됩니다.
- 문자를 숫자로 바꿔준다.
- 숫자에 해당하는 리스트의 인덱스로 사용한다.
ord 함수에 대해 잘 모른다면 아래 포스트를 확인 바랍니다.
2023.11.20 - [알고리즘 설명] - 파이썬의 문자를 숫자로, 숫자를 문자로 바꾸기
문제 풀이
그럼 직접 문제를 풀면서 어떻게 사용하는지 알아보겠습니다.
입력 받기
st = input()
st_cnt = [0] * 26
소문자로 이루어진 단어 S를 st라는 변수에 담았습니다. 다음으로 알파벳의 숫자를 세어줄 리스트인 st_cnt를 만들었습니다. 리스트의 길이는 a부터 z까지 알파벳의 개수인 26으로 하였습니다.
알파벳 개수 세기
for s in st:
i = ord(s) - ord('a')
st_cnt[i] += 1
입력된 문자열 st에서 문자 하나하나를 s로 받아 반복합니다. 다음으로 인덱스를 세기 위해 ord 함수를 사용하여 문자를 아스키코드값으로 변경합니다.
a를 아스키 코드값으로 변경하면 97이 됩니다. a가 97이면 z는 122가 되어 리스트의 숫자 범위를 122까지 만들어 주어야 합니다. 하지만 이렇게 하면 공간의 낭비가 심하기 때문에 숫자 97을 0으로 바꿔주어야 합니다. 마찬가지로 z인 122는 25로 바꿔야 합니다. 이 때 아스키코드값을 외우고 있다면 97을 빼면 되지만 우리가 아스키코드값을 매번 외우고 있을 수는 없습니다.
그래서 숫자 97을 빼는 것이 아니라 ord(’a’)의 값을 빼주어야 합니다. ord(’a’)를 빼주면 우리가 그 값이 97이라는 것을 외울 필요가 없습니다. 마찬가지로 대문자로 된 문자라면 같은 방식으로 아스키코드값을 외우지 않아도 사용할 수 있습니다. A는 65라는 아스키코드값을 가지는데 이것을 외울 필요가 없이 ord(’A’)를 빼면 A가 0이 되고, Z가 25가 됩니다.
해당 문자에 해당하는 인덱스를 구했으니 그것을 통해 해당 리스트의 값을 1 늘려줍니다. 즉 st_cnt라는 리스트의 i번째 항목의 값을 1 늘려주었기 때문에 알파벳의 개수를 셀 수 있는 것입니다.
출력하기
print(*st_cnt)
마지막으로 출력해주는 구문입니다. for문을 사용하여 하나하나 출력해 줄수도 있겠지만 이러게하면 쉽게 한 줄로 결과를 얻을 수 있습니다.
좀 더 설명하자면 리스트 앞에 *을 붙여주면 리스트의 내용을 unpacking하여 리스트 밖으로 끄집어 냅니다. 그냥 st_cnt를 출력했다면 결과 앞과 뒤에 대괄호([, ]) 가 있고, 각 항목마다 콤마( , ) 로 구분되었겠지만 unpacking 하였기 때문에 그냥 순서대로 출력이 되는 것입니다.
전체코드
전체 코드를 다시한번 확인해 보겠습니다.
st = input()
st_cnt = [0] * 26
for s in st:
i = ord(s) - ord('a')
st_cnt[i] += 1
print(*st_cnt)
'알고리즘 문제 풀이' 카테고리의 다른 글
[백준 1865] 웜홀 - 플로이드 워셜 풀이 (0) | 2023.12.17 |
---|---|
[백준 1504] 특정한 최단 경로 (0) | 2023.12.09 |
[백준 11438] LCA 2 (0) | 2023.11.15 |
[백준 24955] 숫자 이어 붙이기 (0) | 2023.11.10 |
[백준 11812] K진 트리 (1) | 2023.11.06 |