자료구조 문제풀이

밤비나·2023년 3월 21일

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

inputNum = int(input('1보다 큰 정수 입력: '))
listA = []
listB = []

for n in range(1, inputNum+1):
    if n == 1:
        listA.append(n)
    else:
        if inputNum % n == 0:
            listA.append(n)

for number in range(2, inputNum+1):
    flag = True
    for n in range(2, number):
        if number % n == 0:
            flag = False
            break

    if flag:
        listB.append(number)

print(f'{inputNum}의 약수: {listA}')
print(f'{inputNum}까지의 소수: {listB}')

'''
1보다 큰 정수 입력: 20
20의 약수: [1, 2, 4, 5, 10, 20]
20까지의 소수: [2, 3, 5, 7, 11, 13, 17, 19]
'''

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

import random

even_list = []
odd_list = []

for i in range(10):
    num = random.randint(1, 100)
    if num % 2 == 0:
        even_list.append(num)
    else:
        odd_list.append(num)

print("짝수 리스트: ", even_list)
print("짝수 개수: ", len(even_list))
print("홀수 리스트: ", odd_list)
print("홀수 개수: ", len(odd_list))

'''
짝수 리스트:  [88, 38, 42]
짝수 개수:  3
홀수 리스트:  [53, 81, 65, 1, 87, 53, 19]
홀수 개수:  7
'''

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

import random

visitors = []

for n in range(100):
    visitors.append(random.randint(1, 100))

group1, group2, group3, group4, group5 = 0,0,0,0,0
for age in visitors:

    if age >= 0 and age <= 7:
        group1 += 1
    elif age >= 8 and age <= 13:
        group2 += 1
    elif age >= 14 and age <= 19:
        group3 += 1
    elif age >= 20 and age <= 64:
        group4 += 1
    else:
        group5 += 1

group1Price = group1 * 0
group2Price = group2 * 200
group3Price = group3 * 300
group4Price = group4 * 500
group5Price = group5 * 0

print('-' * 25)
print(f'영유아\t: {group1}명\t: {group1Price}원')
print(f'어린이\t: {group2}명\t: {group2Price}원')
print(f'청소년\t: {group3}명\t: {group3Price}원')
print(f'성인\t\t: {group4}명\t: {group4Price}원')
print(f'어르신\t: {group5}명\t: {group5Price}원')

sum = group1Price + group2Price + group3Price + group4Price + group5Price
sumFormat = format(sum, ',')
print('-' * 25)
print(f'1일 요금 총합계: {sumFormat}원')
print('-' * 25)

'''
-------------------------
영유아	: 12명	: 0원
어린이	: 8명	: 1600원
청소년	: 5명	: 1500원
성인		: 46명	: 23000원
어르신	: 29명	: 0원
-------------------------
1일 요금 총합계: 26,100원
-------------------------
'''

친구 이름 다섯 명을 리스트에 저장하고 오름차순과 내림차순으로 정렬해보자

friends = []

for i in range(5):
    friends.append(input('친구 이름 입력: '))

print(f'친구들 : {friends}')

friends.sort()
print(f'오름차순 : {friends}')

friends.sort(reverse=True)
print(f'내림차순 : {friends}')

'''
친구 이름 입력: 바바
친구 이름 입력: 이지
친구 이름 입력: 포포
친구 이름 입력: 나나
친구 이름 입력: 알리
친구들 : ['바바', '이지', '포포', '나나', '알리']
오름차순 : ['나나', '바바', '알리', '이지', '포포']
내림차순 : ['포포', '이지', '알리', '바바', '나나']
'''

중복 숫자 제거

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}')

'''
numbers : [2, 22, 7, 8, 9, 2, 7, 3, 5, 2, 7, 1, 3]
numbers : [22, 8, 9, 5, 2, 7, 1, 3]
'''

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

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

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

        result.append([n1, n2])

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

'''
result : [[4, 6], [4, 7], [4, 9], [6, 4], [6, 7], [6, 9], [7, 4], [7, 6], [7, 9], [9, 4], [9, 6], [9, 7]]
result length: 12
'''

튜플 합집합 교집합 구하기

tuple1 = (1, 2, 3, 4, 5)
tuple2 = (3, 4, 5, 6, 7)

# 합집합
union = tuple(set(tuple1) | set(tuple2))
print(union)  # (1, 2, 3, 4, 5, 6, 7)

# 교집합
intersection = tuple(set(tuple1) & set(tuple2))
print(intersection)  # (3, 4, 5)

튜플 슬라이싱

# 튜플 생성
my_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

# 슬라이싱을 이용한 부분 튜플 생성
slice_tuple1 = my_tuple[2:6]   # (3, 4, 5, 6)
slice_tuple2 = my_tuple[:5]    # (1, 2, 3, 4, 5)
slice_tuple3 = my_tuple[5:]    # (6, 7, 8, 9, 10)
slice_tuple4 = my_tuple[1:9:2] # (2, 4, 6, 8)

# 슬라이싱을 이용한 튜플 역순 생성
reverse_tuple = my_tuple[::-1] # (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

# 출력
print(slice_tuple1)
print(slice_tuple2)
print(slice_tuple3)
print(slice_tuple4)
print(reverse_tuple)

'''
(3, 4, 5, 6)
(1, 2, 3, 4, 5)
(6, 7, 8, 9, 10)
(2, 4, 6, 8)
(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
'''

다음 튜플의 과일 개수에 대해서 오름차순 및 내림차순으로 정렬
fruits = ({'수박':8},{'포도':13},{'참외':12},{'사과':17},{'자두':19},{'자몽':15})

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

sorted_fruits_asc = sorted(fruits, key=lambda x: list(x.values())[0])
print(sorted_fruits_asc)

sorted_fruits_desc = sorted(fruits, key=lambda x: list(x.values())[0], reverse=True)
print(sorted_fruits_desc)

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

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

totalCnt = sum(studentCnt.values())
avgCnt = totalCnt/len(studentCnt)
minCls, minStdCnt = min(studentCnt.items(), key=lambda x: x[1])
maxCls, maxStdCnt = max(studentCnt.items(), key=lambda x: x[1])
deviation = {k: round(v - avgCnt, 2) for k, v in studentCnt.items()}

print(f'전체 학생 수: {totalCnt}명')
print(f'평균 학생 수: {round(avgCnt, 2)}명')
print(f'학생 수가 가장 적은 학급: {minCls}({minStdCnt}명)')
print(f'학생 수가 가장 많은 학급: {maxCls}({maxStdCnt}명)')
print(f'학급별 학생 편차: {deviation}')

'''
전체 학생 수: 160명
평균 학생 수: 20.0명
학생 수가 가장 적은 학급: cls08(17명)
학생 수가 가장 많은 학급: cls07(23명)
학급별 학생 편차: {'cls01': -2.0, 'cls02': 1.0, 'cls03': 0.0, 'cls04': -1.0, 'cls05': 2.0, 'cls06': 0.0, 'cls07': 3.0, 'cls08': -3.0}
'''

과목별 점수를 딕셔너리에 저장하고 출력하는 프로그램

subjects = ['국어','영어','수학','과학','국사']
scores = {}

for s in subjects:
    score = input(s + '점수 입력: ')
    scores[s] = score

print(f'과목별 점수 : {scores}')

'''
국어점수 입력: 96
영어점수 입력: 92
수학점수 입력: 87
과학점수 입력: 72
국사점수 입력: 64
과목별 점수 : {'국어': '96', '영어': '92', '수학': '87', '과학': '72', '국사': '64'}
'''

삼각형부터 십각형까지의 내각의 합과 내각을 딕셔너리에 저장하는 프로그램을 만들어 보자

angles = {}
for i in range(3, 11):
    angle_sum = (i-2)*180
    angles[f"{i}각형"] = {"합": angle_sum, "한 변의 내각": angle_sum/i}
print(angles)

#{'3각형': {'합': 180, '한 변의 내각': 60.0}, '4각형': {'합': 360, '한 변의 내각': 90.0}, '5각형': {'합': 540, '한 변의 내각': 108.0}, '6각형': {'합': 720, '한 변의 내각': 120.0}, '7각형': {'합': 900, '한 변의 내각': 128.57142857142858}, '8각형': {'합': 1080, '한 변의 내각': 135.0}, '9각형': {'합': 1260, '한 변의 내각': 140.0}, '10각형': {'합': 1440, '한 변의 내각': 144.0}}

1부터 10까지 각각의 정수에 대한 약수를 저장하는 딕셔너리를 만들고 출력하는 프로그램을 만들어 보자

divisors = {}
for i in range(1, 11):
    divisors[i] = []
    for j in range(1, i+1):
        if i % j == 0:
            divisors[i].append(j)

for i in divisors:
    print(f"{i}의 약수: {divisors[i]}")
    
'''
1의 약수: [1]
2의 약수: [1, 2]
3의 약수: [1, 3]
4의 약수: [1, 2, 4]
5의 약수: [1, 5]
6의 약수: [1, 2, 3, 6]
7의 약수: [1, 7]
8의 약수: [1, 2, 4, 8]
9의 약수: [1, 3, 9]
10의 약수: [1, 2, 5, 10]
'''

다음 문구를 공백으로 구분하여 리스트에 저장한 후, 인덱스와 단어를 이용해서 딕셔너리에 저장해보자.

aboutPython = '파이썬은 1991년 프로그래머인 귀도 반 로섬이 발표한 고급 프로그래밍 언어이다.'
word_list = aboutPython.split()

result = {}
for idx, word in enumerate(word_list):
    result[idx] = word

print(result)

#{0: '파이썬은', 1: '1991년', 2: '프로그래머인', 3: '귀도', 4: '반', 5: '로섬이', 6: '발표한', 7: '고급', 8: '프로그래밍', 9: '언어이다.'}

다음은 학생 정보 테이블이다. 파이썬에서 학생 정보를 가장 효율적으로 저장하고 관리할 수 있는 자료구조를 선택해서 컨테이너 자료형으로 만들어보자.

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 memNo, student in students.items():
    print('-' * 40)
    print(f"회원번호 : {memNo}")
    for key, value in student.items():
        print(f"{key} : {value}")

# 회원번호로 회원 정보 검색
memNo = input('조회할 회원번호를 입력하세요.: ')
if memNo in students:
    student = students[memNo]
    print(f"{memNo} : {student}")
else:
    print(f"{memNo}는 존재하지 않는 회원번호입니다.")
profile
씨앗 데이터 분석가.

0개의 댓글