프로그래머스 파이썬 기초 트레이닝 :: 문자 개수 세기(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 함수를 작성해 주세요.


my_string
"Programmers"

result
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0]





문제 이해

아스키코드 변환, 문자 ↔ 숫자 변환하는 함수인 chr(), ord() 활용 문제

문자열 문자 확인은 in 멤버 연산자, 개수 세기는 count 

chr(num) : 숫자를 문자로 변환

ord(char) : 문자를 숫자로 변환  




-----------------------------------



다양한 iterable 선언 방식   

문자열 

for i in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

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 

count를 쓰지않고, 찾은 문자열을 split한 리스트 길이를 활용 
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' 문자열 같은 경우에는 ['Programmers'] 3개가 들어있다

'r' 로 짤려진 리스트 길이는 ['P', 'og', 'amme', 's'] 으로 4가 된다. 

따라서 len(my_string.split(i))-1 = 3 이되고, answer 리스트에 3으로 저장됨



string.count(value) 

count 메서드를 사용하는 방법 
def solution(my_string):
    answer = []
    for alphabet in 'abcdefghijklmnopqrstuvwxyz'.upper()+'abcdefghijklmnopqrstuvwxyz' :
        answer.append(my_string.count(alphabet))
    return answer

count를 사용하면 더 편해진다.




-----------------------------------


ord(char) 함수 

문자를 숫자로 바꾸는 ord() 함수를 활용한 코드  
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) 함수 

숫자를 문자로 바꾸는 chr() 함수를 활용한 코드  
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 메서드 사용


 


-----------------------------------


 

딕셔너리  

반복문 활용해 할당   

딕셔너리로 key = 문자 : value : 인덱스 선언하고, 값 추가  
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






댓글

이 블로그의 인기 게시물

KT 에이블스쿨 : 대구광역시 공공데이터 활용 창업경진대회 준비

[KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

KT 에이블스쿨 : 핀테크 아이디어 공모전