[Python] 자료구조 문제 풀이 - 리스트, 튜플

박미영·2023년 3월 21일
0

📌리스트

📍문제1

Q. 1부터 사용자가 입력한 숫자까지의 약수와 소수를 리스트에 각각 저장하고, 이것을 출력하는 프로그램을 만들어보자.

inputNumber = int(input('1보다 큰 정수 입력: '))
listA, listB = [], [] # 소수, 약수

for n in range(1, inputNumber+1):
    if n == 1 or inputNumber % n == 0:
        listB.append(n)

    if n >= 2:
        flag = True
        for i in range(2, n):
            if n % i == 0:
                flag = False
                break
        if flag:
            listA.append(n)

print(f'{inputNumber}의 소수: {listA}')
print(f'{inputNumber}의 약수: {listB}')
  • 출력결과



📍문제2

Q. 1부터 100사이에 난수 10개를 생성한 후 짝수와 홀수를 구분해서 리스트에 저장하고 각각의 개수를 출력하는 프로그램을 만들어보자

import random

randomList = random.sample(range(1, 101), 10) # 1부터 100까지 10개 난수 생성
evens, odds = [], []

for i in randomList:
    if i % 2 == 0:
        evens.append(i)
    else:
        odds.append(i)

print(f'짝수: {evens}, 개수: {len(evens)}개')
print(f'홀수: {odds}, 개수: {len(odds)}개')
  • 출력결과


💡알게된 문법 - 범위 난수 생성

1부터 100까지의 범위에서 10개 난수 생성

randomList = random.sample(range(1, 101), 10) 



📍문제3

Q.다음은 공원 입장료를 나타낸 표이다. 1일 총 입장객이 100명이라고 할 때, 1일 전체 입장 요금을 구하는 프로그램을 만들어보자.
단, 입장 고객의 나이는 난수를 이용한다.

import random

randomList = [random.randint(1, 100) for i in range(100)] # 100개 난수 생성
guestsDic ={'영유아':0, '어린이':0, '청소년':0, '성인':0, '어르신':0}

for guest in randomList:
    if guest <= 7:
        guestsDic['영유아'] += 1
    elif guest <= 13:
        guestsDic['어린이'] += 1
    elif guest <= 19:
        guestsDic['청소년'] += 1
    elif guest <= 64:
        guestsDic['성인'] += 1
    elif guest >= 65:
        guestsDic['어르신'] += 1


print('-'*25)
print(f'영유아\t: {guestsDic["영유아"]}명\t: {0}원')
print(f'어린이\t: {guestsDic["어린이"]}명\t: {200 * guestsDic["어린이"]}원')
print(f'청소년\t: {guestsDic["청소년"]}명\t: {300 * guestsDic["청소년"]}원')
print(f'성인\t\t: {guestsDic["성인"]}명\t: {500 * guestsDic["성인"]}원')
print(f'어르신\t: {guestsDic["어르신"]}명\t: {0}원')
print('-'*25)
print(f'1일 요금 총합계: {(200 * guestsDic["어린이"]) + (300 * guestsDic["청소년"]) + (500 * guestsDic["성인"])}원')
print('-'*25)
  • 출력결과



📍문제4

Q. 4개의 숫자 중 서로 다른 숫자 2개를 선택해서 만들 수 있는 모든 경우의 수를 출력하는 프로 그램을 만들어보자.

✔️방법1 - 이중 for문

numbers = [4, 6, 7, 9]
result = []

for n1 in numbers:
    for n2 in numbers:
        if n1 != n2:
            result.append([n1, n2])

print(f'result: {result}')
print(f'result len: {len(result)}')
  • 출력결과

✔️방법2 - permutations 모듈

from itertools import permutations

resultPM = list(permutations(numbers, 2))
print(f'resultPM: {resultPM}')
print(f'resultPM len: {len(result)}')
  • 출력결과

✔️갯수만 구하는 경우 - 수학공식

순열 공식: n! / (n-r)!

# 수학 순열
import math
permutation = math.factorial(len(numbers)) / math.factorial(len(numbers) - 2)
print(f'permutation: {int(permutation)}')
  • 출력결과




📌튜플

📍문제1

Q.다음 2개의 튜플에 대해서 합집합과 교집합을 출력해보자.

tuple1 = 1, 3, 2, 6, 12, 5, 7, 8
tuple2 = 0, 5, 2, 9, 8, 6, 17, 3

tempHap, tempGyo = list(tuple1), []

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

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

print(f'합집합(중복x)\t: {tempHap}')
print(f'교집합\t\t: {tempGyo}')
  • 출력결과



📍문제2

Q. 다음 튜플의 과일 개수에 대해서 오름차순 및 내림차순으로 정렬해보자.

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

cIdx, nIdx, eIdx = 0, 1, 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

fruits = tuple(fruits)
print(fruits)

- 출력결과



📍문제3

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

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

totalCnt, minClsCnt, maxClsCnt = 0, 0, 0
minCls, maxCls = '', ''
deviation = []

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

        if maxClsCnt < v:
            maxClsCnt = v
            maxCls = k

        if minClsCnt == 0 or minClsCnt > v:
            minClsCnt = v
            minCls = k

avgCnt = totalCnt / len(studentCnt)

print(f'전체 학생 수: {totalCnt}명')
print(f'평균 학생 수: {avgCnt}명')
print(f'학생 수가 가장 적은 학급: {minCls}({minClsCnt}명)')
print(f'학생 수가 가장 많은 학급: {maxCls}({maxClsCnt}명)')

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

print(f'학급별 학생 편자: {deviation})')
  • 출력결과




"이 글은 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."

0개의 댓글