본문 바로가기
제로베이스 데이터 스쿨/일일 스터디 노트

15일차 스터디노트 / 파이썬 자료구조(리스트, 튜플, 딕셔너리) 연습문제

by 김뎀뎀 2023. 1. 21.

※제로베이스 데이터 취업스쿨 11기 수강 중

📗 15일차 공부 내용 요약

파이썬 자료구조(리스트, 튜플, 딕셔니리)에 대한 연습문제를 풀었다

 


📖  15일차 공부 내용 자세히

※기억에 남는 문제 위주로 남긴다

1. 리스트

Q.다음 리스트에서 중복 아이템(숫자)을 제거하는 프로그램을 만들어보자
'''
numbers : [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
numbers : [22, 8, 9, 5, 2, 7, 1, 3]
'''
#풀이 1
numbers = [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
print(f'numbers : {numbers}')

for n in numbers:
    if numbers.count(n) >= 2:
        numbers.remove(n)

print(f'numbers : {numbers}')

#풀이 2
idx = 0
while True:
    if idx >= len(numbers):
        break #인덱스가 끝까지 가면 멈춤

    if numbers.count(numbers[idx]) >= 2:
        numbers.remove(numbers[idx])
        continue #해당 인덱스부터 다시 찾기

    idx += 1 #다음 인덱스에서 찾기

print(f'numbers : {numbers}')

 

Q.4개의 숫자 중 서로 다른 3개를 선택해서 만들 수 있는 모든 경우의 수를 출력하는 프로그램을 만들어보자.
numbers = [4, 6, 7, 9]
result = []

for n1 in numbers:
    for n2 in numbers:
        if n1 == n2:
            continue
        for n3 in numbers:
            if n1 == n3 or n2 == n3:
                continue

            result.append([n1, n2, n3])

print(f'result: {result}')
print(f'result length: {len(result)}')

import math

permutation = math.factorial(len(numbers)) / math.factorial((len(numbers) - 3))
print(f'permutation : {int(permutation)}')

 

2.튜플

Q.다음 2개의 튜플에 대해서 합집합과 교집합을 출력해보자
#풀이 1
tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)

tempHap = list(tuple1)
tempGyo = list()

for n in tuple2:
    if n not in tempHap:
        tempHap.append(n)
    else:
        tempGyo.append(n)

tempHap = tuple(sorted(tempHap))
tempGyo = tuple(sorted(tempGyo))

print(f'합집합(중복X)\t : {tempHap}')
print(f'교집합\t\t : {tempGyo}')


#풀이2
tuple1 = (1, 3, 2, 6, 12, 5, 7, 8)
tuple2 = (0, 5, 2, 9, 8, 6, 17, 3)

tempHap = tuple1 + tuple2
tempGyo = list()
tempHap = list(tempHap)

for n in tempHap:
    if tempHap.count(n) > 1:
        tempGyo.append(n)
        tempHap.remove(n)

print(f'tempHap : {tempHap}')
print(f'합집합(중복X): {tuple(sorted(tempHap))}')

print(f'tempGyo : {tempGyo}')
print(f'교집합 : {tuple(sorted(tempGyo))}')

 

Q.다음 튜플의 과일 개수에 대해서 오름차순 및 내림차순으로 정렬해보자.
'''
({'수박': 8}, {'참외': 12}, {'포도': 13}, {'자몽': 15}, {'사과': 17}, {'자두': 19})
({'자두': 19}, {'사과': 17}, {'자몽': 15}, {'포도': 13}, {'참외': 12}, {'수박': 8})
'''
#인덱스를 활용해, 앞쪽에 있는 것들과 비교하면서
#pop을 이용해 떼어내고, insert를 이용해 삽입

fruits = ({'수박':8}, {'포도':13}, {'참외':12}, {'사과':17}, {'자두':19}, {'자몽':15})
fruits = list(fruits)

cIdx = 0; nIdx = 1 #현재 인덱스, 다음 인덱스 => 시작값 셋팅
eIdx = len(fruits) - 1 #마지막 인덱스

flag = True
while flag:
    curDic = fruits[cIdx] #현재 과일 딕셔너리
    nextDic = fruits[nIdx] #다음 과일 딕셔너리

    curDicCnt = list(curDic.values())[0] #현재 딕셔너리 과일 개수, 리스트 형변화
    nextDicCnt = list(nextDic.values())[0] #다음 딕셔너리 과일 개수, 리스트 형변환

    # 다음 과일 개수가 현재보다 적으면, 그 과일 딕셔너리를 잘라내서, 현재 인덱스 위치에 넣음
    if nextDicCnt < curDicCnt:
        fruits.insert(cIdx, fruits.pop(nIdx))
        # nIdx = cIdx + 1 #자리 바꿈을 했으니, 반복을 초기화 시켜줌
        # continue

    nIdx += 1
    if nIdx > eIdx:
        cIdx += 1
        nIdx = cIdx + 1

        if cIdx == 5:
            flag = False

print(tuple(fruits))

 

Q.학급별 학생 수를 나타낸 튜플을 이용해서, 요구 사항에 맞는 데이터를 출력하는 프로그램을 만들어보자.
#enumerate()와 ietems()를 활용

studentCnt = ({'cls01':18},
              {'cls02':21},
              {'cls03':20},
              {'cls04':19},
              {'cls05':22},
              {'cls06':20},
              {'cls07':23},
              {'cls08':17})

totalCnt = 0
minStdCnt = 0; minCls = ''
maxStdCnt = 0; maxCls = ''
deviation = []

for idx, dic in enumerate(studentCnt):
    for k, v in dic.items():
        totalCnt += v

        if idx == 0 or minStdCnt > v:
            minStdCnt = v
            minCls = k

        if maxStdCnt < v:
            maxStdCnt = v
            maxCls = k

print(f'전체 학생 수: {totalCnt}명')

avgCnt = totalCnt/len(studentCnt)
print(f'평균 학생 수: {round(avgCnt, 2)}명')

print(f'학생 수가 가장 적은 학급: {minCls}({minStdCnt}명)')
print(f'학생 수가 가장 많은 학급: {maxCls}({maxStdCnt}명)')

for idx, dic in enumerate(studentCnt):
    for k, v in dic.items():
        deviation.append({k:round(v-avgCnt, 2)})

print(f'학급별 학생 편차: {deviation}')

 

3.딕셔너리

Q.파이썬에서 학생 정보를 가장 효율적으로 저장하고 관리할 수 있는 자료구조를 선택해서 컨테이너 자료형으로 만들어보자.
students = {'S21-0001':{'이름':'최성훈',
                        '성구분':'M',
                        '전공':'디자인',
                        '연락처':'010-1234-5678',
                        '메일':'hun@gmail.com',
                        '취미':['농구', '음악']},
            'S21-0002': {'이름': '탁영우',
                         '성구분': 'M',
                         '전공': '바리스타',
                         '연락처': '010-5678-9012',
                         '메일': 'yeong@gmail.com',
                         '취미': ['축구']},
            'S21-0003': {'이름': '황진영',
                         '성구분': 'W',
                         '전공': '음악',
                         '연락처': '010-9012-3456',
                         '메일': 'jin@gmail.com',
                         '취미': ['수영', '코딩']}
            }

for k1 in students.keys():
    print('-' * 40)
    print('회원번호 : {}'.format(k1))

    student = students[k1] #회원번호에 따른 딕셔너리 저장
    for k2 in student.keys():
        print('{} : {}'.format(k2, student[k2]))


memNo = input('조회할 회원번호를 입력하세요.: ')
print('{} : {}'.format(memNo, students[memNo]))

➰ 15일차 후기

자료구조 개념을 학습할 때는 무리가 없었는데, 연습문제 풀이를 시작하니 난관에 봉착하는 순간이 많았다;

분명 알고 있던 함수들이었는데도, 문제를 풀 때는 생각이 안나서 더 길게 코드를 작성하고 해설을 보고서야 아!하면서 나 자신의 미련함을 꾸짖기도 햇다.

내용들을 다시 살펴봐야 하는데, 아직 이번주차 진도를 얼른 끝내야해서 조급한 마음이크다ㅜ 당장 다음주에 파이썬 프로그래밍테스트인데~~!!!

그래도 묵묵하게 해보자 라고 다짐해본다,,


※본 내용은 제로베이스 데이터 취업 스쿨에서 제공하는 학습 내용에 기반합니다.