logo
Search검색어를 포함하는 게시물들이 최신순으로 표시됩니다.
    Table of Contents
    [Python] 자료구조 - 셋, 딕셔너리 - 연습문제 1~10

    이미지 보기

    [Python] 자료구조 - 셋, 딕셔너리 - 연습문제 1~10

    • 22.01.06 작성

    • 읽는 데 14

    TOC

    참고 강의

    SWEA 파이썬 프로그래밍 기초(2) 파이썬의 기본 응용 #27 ~ #35


    연습문제 #2

    문제

    다음과 같이 등록된 학생의 이름을 출력하고, 이름을 입력하면 전화번호를 출력해주는 딕셔너리 객체를 이용한 전화번호부 프로그램을 작성하십시오.

    [등록된 학생]

    홍길동: 010-1111-1111 이순신: 010-1111-2222 강감찬: 010-1111-3333

    [프로그램]

    아래 학생들의 전화번호를 조회할 수 있습니다. 홍길동 이순신 강감찬 전화번호를 조회하고자 하는 학생의 이름을 입력하십시오.

    입력

    이순신
    

    출력

    아래 학생들의 전화번호를 조회할 수 있습니다.
    홍길동
    이순신
    강감찬
    전화번호를 조회하고자 하는 학생의 이름을 입력하십시오.
    이순신의 전화번호는 010-1111-2222입니다.
    

    Sol

    등록된 학생을 딕셔너리 형태로 지정한 뒤, 각각의 이름(key)을 출력하고, 원하는 key를 입력했을 때, 해당 key의 value를 출력하면 될 것이다.

    students = {
        "홍길동": "010-1111-1111",
        "이순신": "010-1111-2222",
        "강감찬": "010-1111-3333"
    }
    
    print("아래 학생들의 전화번호를 조회할 수 있습니다.")
    
    for key in students.keys():
        print(key)
    
    print("전화번호를 조회하고자 하는 학생의 이름을 입력하십시오.")
    
    target = input()
    
    print("{0}의 전화번호는 {1}입니다.".format(target, students[target]))
    

    제출결과

    image

    연습문제 #3

    문제

    아래의 상품 딕셔너리 데이터를 가격에 따라 내림차순으로 정렬하는 프로그램을 작성하십시오.

    "TV": 2000000, "냉장고": 1500000, "책상": 350000, "노트북": 1200000, "가스레인지": 200000, "세탁기": 1000000,

    출력

    TV: 2000000
    냉장고: 1500000
    노트북: 1200000
    세탁기: 1000000
    책상: 350000
    가스레인지: 200000
    

    Sol A - 실패

    data_dict = {
        "TV": 2000000,
        "냉장고": 1500000,
        "책상": 350000,
        "노트북": 1200000,
        "가스레인지": 200000,
        "세탁기": 1000000
    }
    
    value_list = [value for value in data_dict.values()]
    value_list.sort()       # 가격의 오름차순 정렬
    value_list.reverse()    # 가격의 내림차순 정렬
    

    가격, 즉 각각의 value 값을 리스트로 추출하여 내림차순 정렬한 뒤, 해당하는 각각의 value를 가지는 key를 for문을 이용해 찾아 key: value 를 출력하면 될 것이라고 생각했다. 그래서 value의 내림차순 리스트까지 추출하였으나, 이 값을 가지는 key를 찾아 같이 출력하는 방법을 도저히 생각해낼 수 없어 인터넷 조사로 풀이를 마친다.

    Sol B - 내 답이 아님!

    • operator 모듈을 import 한다.
    • operator.itemgetter()함수
      • operator.itemgetter(0) : key를 기준으로 정렬
      • operator.itemgetter(1) : value를 기준으로 정렬
    • default : 오름차순
    • 내림차순을 위해서는 reverse=True 속성을 추가한다.
    import operator
    
    dic = {
        "TV": 2000000,
        "냉장고": 1500000,
        "책상": 350000,
        "노트북": 1200000,
        "가스레인지": 200000,
        "세탁기": 1000000
    }
    
    dic = dict(sorted(dic.items(), key=operator.itemgetter(1), reverse=True))
    for key, value in dic.items():
        print("{0}: {1}".format(key, value))
    

    제출결과

    image

    나로서는 너무 수준 높은 풀이였다... 아마 강의 내용에서 배운 수준으로 풀 수도 있었을 것인데, 내가 잘 익히지 못해 실패했을 수도 있다. 복습하면서 다시 한 번 도전해보자.


    연습문제 #4

    문제

    다음 두 딕셔너리 객체를 합쳐 중복된 메뉴가 없는 딕셔너리를 만들고 가격이 3000원 이상인 메뉴를 아래와 같이 출력하는 프로그렘을 작성하십시오. 중복된 메뉴의 가격이 다를 경우 딕셔너리 a의 가격을 사용하세요.

    a = {'아메리카노': 1900, '카페모카': 3300, '에스프레소': 1900, '카페라떼': 2500, '카푸치노': 2500, '바닐라라떼': 2900}
    b = {'헤이즐럿라떼': 2900, '카페모카': 3300, '밀크커피': 3300, '아메리카노': 1900, '샷크린티라떼': 3300}
    

    출력

    {('카페모카', 3300), ('밀크커피', 3300), ('샷크린티라떼', 3300)}
    

    Sol

    a = {
        "아메리카노": 1900,
        "카페모카": 3300,
        "에스프레소": 1900,
        "카페라떼": 2500,
        "카푸치노": 2500,
        "바닐라라떼": 2900,
    }
    b = {"헤이즐럿라떼": 2900, "카페모카": 3300, "밀크커피": 3300, "아메리카노": 1900, "샷크린티라떼": 3300}
    
    b.update(a)
    
    # for item in b.items():
    #     if item[1] >= 3000:
    #         print(item)
    
    result = {item for item in b.items() if item[1] >= 3000}
    print(result)
    

    굉장히 애를 먹은 문제였다. 딕셔너리 내포를 사용해보고 싶었는데 너무 안 돼서 for문을 직접 만들어 구조화시킨 뒤, 이를 다시 내포를 이용해 구성해보았다.

    제출결과

    image

    연습문제 #5

    문제

    리스트의 원소를 키로 하고, 그 원소의 length를 값으로 갖는 딕셔너리 객체를 생성하는 코드를 작성해봅시다. 이 때 딕셔너리 내포 기능을 사용하며, 원소의 공백은 제거합니다. 리스트 fruit는 다음과 같습니다. fruit = [' apple ','banana',' melon']

    출력

    {'apple': 5, 'banana': 6, 'melon': 5}
    

    Sol A

    공백을 제거하라는데, 공백을 제거하는 함수를 모른다. 그래서 만들었다.

    fruit = [" apple ", "banana", " melon"]
    
    
    # 공백 제거 함수
    def KillEmpty(word):
        target = list(word)
        word_r = ""
    
        for i in target:
            if i != " ":
                word_r += i
    
        return word_r
    
    
    fruit_list = [KillEmpty(i) for i in fruit]
    
    
    fruit_dict = {key: len(key) for key in fruit_list}
    print(fruit_dict)
    

    공백을 제거하는 KillEmpty() 함수를 만들고, 과일 리스트의 과일의 공백을 제거하는 리스트 내포를 이용해 리스트를 만든다. 이후 이 리스트를 키로 하고, 키와 키의 길이를 각각 key와 value로 하는 딕셔너리를 딕셔너리 내포를 이용해 만든 뒤 출력한다.

    제출결과

    image

    Sol B

    공백을 제거하는 함수가 분명히 있을 것이기 때문에 인터넷을 찾아보았다. 바로 str.replace(" ","") 이다. 즉, 공백을 정말 아무것도 없는 것으로 대체(replace)하는 것이다.

    fruit = [" apple ", "banana", " melon"]
    
    fruit_list = [i.replace(" ", "") for i in fruit]
    fruit_dict = {key: len(key) for key in fruit_list}
    print(fruit_dict)
    

    정말 간결하게 해결할 수 있었다.

    제출결과

    image

    연습문제 #6

    문제

    다음과 같이 정수 N을 입력받아서 1부터 N까지의 정수를 키로 하고, 그 정수의 제곱을 값으로 하는 딕셔너리 객체를 만드는 코드를 작성하십시오.

    입력

    5
    

    출력

    {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
    

    Sol

    n = int(input())
    
    n_list = [i for i in range(1, n + 1)]
    result_dict = {n: n ** 2 for n in n_list}
    print(result_dict)
    

    n을 입력받아 1부터 n까지 1씩 증가하는 항목을 담은 리스트를 내포를 이용해 만들고, 이 각각의 n으로부터 n: n**2 를 항목으로 하는 딕셔너리를 내포를 이용해 만들어 출력한다.

    제출결과

    image

    연습문제 #7

    문제

    다음과 같이 사용자가 입력한 문장에서 숫자와 문자를 구별해 각각의 개수를 출력하는 프로그램을 작성하십시오.

    입력

    hello world! 123
    

    출력

    LETTERS 10
    DIGITS 3
    

    Sol

    무엇을 위해 셋과 딕셔너리 파트에서 나온 문제인지 알 수 없다. 그냥 replace() 함수로 공백을 제거한 뒤, try문나 if문으로 조건에 맞춰 LETTERS와 DIGITS의 수를 더하며 쉽게 풀어낼 수 있었다.

    LETTERS, DIGITS = 0, 0
    
    a = input()
    a.replace(" ", "")
    
    for i in a:
        try:
            int(i)
        except:
            if ("a" <= i <= "z") or ("A" <= i <= "Z"):
                LETTERS += 1
        else:
            DIGITS += 1
    
    print("{0} {1}".format("LETTERS", LETTERS))
    print("{0} {1}".format("DIGITS", DIGITS))
    

    제출결과

    image

    연습문제 #8

    문제

    다음과 같이 사용자가 입력한 문장에서 대소문를 구별해 각각의 갯수를 출력하는 프로그램을 작성하십시오.

    입력

    Hello World! 123
    

    출력

    UPPER CASE 2
    LOWER CASE 8
    

    Sol

    7번과 같은 문제다. 오히려 더 간단하다.

    UC, LC = 0, 0
    
    a = input()
    
    for i in list(a):
        if "a" <= i <= "z":
            LC += 1
        elif "A" <= i <= "Z":
            UC += 1
    
    print("{0} {1}".format("UPPER CASE", UC))
    print("{0} {1}".format("LOWER CASE", LC))
    

    제출결과

    image

    연습문제 #9

    문제

    다음과 같은 기존의 맥주 가격을 5% 인상하려고 할 경우 딕셔너리 내포 기능을 이용한 코드를 작성하십시오.

    beer = {'하이트': 2000, '카스': 2100, '칭따오': 2500, '하이네켄': 4000, '버드와이저': 500}
    

    출력

    {'하이트': 2000, '카스': 2100, '칭따오': 2500, '하이네켄': 4000, '버드와이저': 500}            # 인상 전
    {'하이트': 2100.0, '카스': 2205.0, '칭따오': 2625.0, '하이네켄': 4200.0, '버드와이저': 525.0}  # 인상 후
    

    Sol

    beer = {"하이트": 2000, "카스": 2100, "칭따오": 2500, "하이네켄": 4000, "버드와이저": 500}
    beer_up = {item[0]: item[1] * 1.05 for item in beer.items()}
    
    # print("{0}{1}".format(beer, "            # 인상 전"))
    # print("{0}{1}".format(beer_up, "  # 인상 후"))
    
    print(beer)
    print(beer_up)
    

    딕셔너리 내포를 이용하면 간단하게 풀 수 있는 문제였다.

    제출결과

    image

    출력에 주석이 있었는데, 이를 구현하려고 하다가 1 fail 당했다. 딕셔너리만 출력하니까 Pass를 받았다.


    연습문제 #10

    문제

    다음의 결과와 같이 입력된 문자열의 문자 빈도수를 구하는 프로그램을 작성하십시오.

    입력

    abcdefgabc
    

    출력

    a,2
    b,2
    c,2
    d,1
    e,1
    f,1
    g,1
    

    Sol

    전처리는 다음의 과정을 진행하면 될 것 같다.

    1. input()을 set() 처리하여 중복 항목 제거
    2. list() 처리하여 sort 준비
    3. sorted() 처리하여 오름차순 정렬

    이후의 과정은 차차 해보는 걸로 하자. 기존에 단계의 흐름을 따라가기 위해 여러 행과 변수를 만들어 flow를 쉽게 보였지만, 전처리 과정을 제시하고 시작하므로 한 줄에 담겠다.

    word = input()
    input = sorted(list(set(word)))
    
    result_dict = {}
    
    # 각각의 요소들 세기
    for a in input:
        cnt = 0
    
        for word_sep in word:
            if word_sep == a:
                cnt += 1
    
        result_dict[a] = cnt
    
    # 각각의 요소 출력
    for item in result_dict.items():
        print("{0},{1}".format(item[0], item[1]))
    

    제출결과

    image
    profile

    FE Developer 박승훈

    노력하는 자는 즐기는 자를 이길 수 없다