프로그래머스 파이썬 기초 트레이닝 :: 문자 개수 세기(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 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

    KT 에이블스쿨 : IT 인프라 (1일차~5일차) 공부 정리

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