프로그래머스 파이썬 기초 트레이닝 :: 문자 개수 세기(chr, ord, count 활용)
문제 설명
프로그래머스 URL
https://school.programmers.co.kr/learn/courses/30/lessons/181902
프로그래머스 코딩 카테고리
코딩 기초 트레이닝
Day 11 리스트(배열) - 문자 개수 세기
Lv.0
문제 내용
알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.
문제 이해
아스키코드 변환, 문자 ↔ 숫자 변환하는 함수인 chr(), ord() 활용 문제
문자열 문자 확인은 in 멤버 연산자, 개수 세기는 count
chr(num) : 숫자를 문자로 변환
ord(char) : 문자를 숫자로 변환
-----------------------------------
다양한 iterable 선언 방식
문자열
for i in 'abcdefghijklmnopqrstuvwxyz'.upper()+'abcdefghijklmnopqrstuvwxyz'
오로지 알파벳 문자로만 이뤄진 문자열을 iterable로 둔 방식
대문자 소문자로 나눠진 문자열을 합쳐서 사용할 수도 있다.
리스트
all_list = [chr(i) for i in range(65, 91)]+[chr(i) for i in range(97,123)]
chr(idx) 가 65번부터 90번까지는 대문자 알파벳(A ~ Z)이고,
97번부터 122번까지는 소문자 알파벳(a ~ z) 를 활용한 리스트
answer = [0] * 52 #1차원배열
answer = [0 for _ in range(52)] #1차원배열
0으로만 이뤄진 빈칸을 선언할때는 이렇게 할 수 있다.
row, col = 3, 5 #행, 열
arr_second = [[0] * cols for _ in range(rows)] #2차원배열
2차원배열 꼭 미리 이렇게 선언을 해둬야한다. arr = [] 이렇게만 선언하면 1차원배열로 됨
딕셔너리
up_dict = {chr(i) : 0 for i in range(ord('A'),ord('Z') + 1)} #대문자
low_dict = {chr(i) : 0 for i in range(ord('a'),ord('z') + 1)} #소문자
ord함수랑 chr함수를 활용해서 문자랑 숫자를 서로 변환해서 딕셔너리를 선언한 방식
딕셔너리는 key, value값 둘다 있어야하는데 이렇게도 선언이 가능
-----------------------------------
알파벳 문자열
len(string.split(i))-1
def solution(my_string):
answer = []
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
for i in alphabet:
answer.append(len(my_string.split(i))-1)
return answer
P라는 문자가 매칭되서, my_string 리스트에서 P를 기준으로 짜르면
my_string -> ['Progrmmers'] (안짤려졌을땐 길이가 1)
my_string.split("P") -> ['', 'rogrammers'] 이렇게 값이 두개가 된다.
짤려진 리스트 길이는 2가되서, len(my_string.split(i))-1 은 1이된다.
'r' 로 짤려진 리스트 길이는 ['P', 'og', 'amme', 's'] 으로 4가 된다.
따라서 len(my_string.split(i))-1 = 3 이되고, answer 리스트에 3으로 저장됨
string.count(value)
def solution(my_string):
answer = []
for alphabet in 'abcdefghijklmnopqrstuvwxyz'.upper()+'abcdefghijklmnopqrstuvwxyz' :
answer.append(my_string.count(alphabet))
return answer
count를 사용하면 더 편해진다.
-----------------------------------
ord(char) 함수
def solution(my_string):
answer=[0]*52
for x in my_string:
if x.isupper():
answer[ord(x)-65]+=1
else:
answer[ord(x)-71]+=1
return answer
ord('A') = 65번
ord('Z') = 90번
ord('a') = 97번
ord('z') = 122번
이 점을 활용해 answer 인덱스 0 ~ 52자리에 값을 추가하는 것
-----------------------------------
chr(num) 함수
def solution(my_string):
chlist=[chr(i) for i in range(65,91)]+[chr(i) for i in range(97,123)]
answer=[]
for i in chlist:
answer.append(my_string.count(i))
return answer
chr() 함수에 count 메서드 사용
-----------------------------------
딕셔너리
반복문 활용해 할당
def solution(my_string):
char_up = {chr(i) : 0 for i in range(ord('A'),ord('Z') + 1)}
char_lo = {chr(i) : 0 for i in range(ord('a'),ord('z') + 1)}
for m in my_string :
if m.isupper() :
char_up[m] += 1
else :
char_lo[m] += 1
return list(char_up.values()) + list(char_lo.values())
딕셔너리를 선언하는 방식과 dict.values()를 활용해 값을 추출하는 방식 습득하기
수동 할당
def solution(my_string):
answer = [0] * 52
chars = { "A": 0, "B": 1, "C": 2, "D": 3, "E": 4,
"F": 5, "G": 6, "H": 7, "I": 8, "J": 9,
"K": 10, "L": 11, "M": 12, "N": 13, "O": 14,
"P": 15, "Q": 16, "R": 17, "S": 18, "T": 19,
"U": 20, "V": 21, "W": 22, "X": 23, "Y": 24,
"Z": 25, "a": 26, "b": 27, "c": 28, "d": 29,
"e": 30, "f": 31, "g": 32, "h": 33, "i": 34,
"j": 35, "k": 36, "l": 37, "m": 38, "n": 39,
"o": 40, "p": 41, "q": 42, "r": 43, "s": 44,
"t": 45, "u": 46, "v": 47, "w": 48, "x": 49,
"y": 50, "z": 51 }
for i in my_string:
cnt = my_string.count(i)
answer[chars[i]] = cnt
return answer
댓글
댓글 쓰기